遊 標

遊標是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。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章