游 标

来源:互联网 发布:淘宝泄漏买家信息 编辑:程序博客网 时间:2024/04/29 16:04

游标是oracle执行sql 语句的内存区域。在数据库编程中,游标是内部数据结构,能够处理sql 查询结果。

 

SQL%ROWCOUNT  会返回被更新的数据行数。

 

为处理显式游标,首先需要声明它,然后打开它。接下来检索它,最后关闭它。

 

    声明游标的语法:

               CURSOR  c_cursor_name   IS   select  statement

 

 

 

记录类型:一个记录就是一个复合的数据结构,这意味着它由一个或者多个元素组成。记录非常类似于数据库表中一行数据,但是记录的每个元素并不会独立存在。PL/SQL 支持三种类型的记录:基于表的(table-based)、基于游标的(cursor-based)以及程序员定义的(programmer-based)。     基于表的记录就是该记录的结构来自于数据库表中某些字段的列表。  基于游标的记录是记录的数据结构匹配预定义游标的元素。为创建一个基于表或者基于游标的记录,可以 用%ROWTYPE 属性:

                   record_name   table_name or cursor_name % ROWTYPE

 

 

     如:  DECLARE

                     vr_student  student%ROWTYPE

             BEGIN

                      SELECT  * INTO   vr_student    from   student  where student_id=156;

                      DBMS_OUTPUT.PUT_LINE(vr_student.first_name|| '   ' || vr_student.last_name|| ' has an ID of  156');

             EXCEPTION

                      WHEN    no_data_found    THEN

                               RAISE_APPLICATION_ERROR(-2001,'The  Student  is not in the database.');

 

             END;

 

 

检索游标的方式:

              FETCH     cursor_name   INTO   PL/SQL  variables;

                 或者

              FETCH     curso_name    INTO   PL/SQL   record;

 

 

     如:

                  DECLARE 

                           CURSOR   c_zip   IS  SELECT    *    from    zipcode;

                           vr_zip       c_zip %ROWTYPE;

                  BEGIN

                            OPEN  c_zip;

                  LOOP

                            FETCH c_zip  INTO  vr_zip;

                            EXIT   WHEN   c_zip%NOTFOUND;

                            DBMS_OUTPUT.PUT_LINE(vr_zip.zip || '   '|| vr_zip.city || '  ' || vr_zip.state);

                 END LOOP;

                 CLOSE  c_zip;   //关闭游标   释放 资源

                 END;

 

 

自定义记录类型

          如:  DECLARE

                    TYPE   instructor_info   IS   RECORD

                      (  first_name   instructor.first_name%TYPE,

                         last_name    instructor.last_name%TYPE,

                         sections   NUMBER);

                     rv_instructor    instructor_info

                  BEGIN

                          SELECT    RTRIM(i.first_name),RTRIM(i.last_name),COUNT(*) INTO  rv_instructor

                                  from instructor  i, section  s   where   i.instructor_id=s.instruector_id

                                            and   i.instructor_id=102

                                  GROUP  BY  i.first_name,i.last_name;

                  END;

 

 

显示 游标属性:

1.%NOTFOUND(cursor_name%NOTFOUND)  :一个Boolean属性,当前面的FETCH操作没有返回数据行时,该属性的值是TRUE,否则是FALSE。

2.%FOUND  (cursor_name%FOUND)  : 一个Boolean 属性,当前面的FETCH操作返回一行数据时,该属性的值是TRUE,否则 是FALSE。

3.%ROWCOUNT  (cursor_name%ROWCOUNT)  :  从游标中所检索的记录数量

4.%ISOPEN   (cursor_name%ISOPEN):  一个Boolean  属性:当游标处于打开状态时,则该属性的值是TRUE,否则 FALSE。

原创粉丝点击