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