Oracle 遊標遍歷 顯式遊標 靜態遊標 OPEN v_cur(); WHILE v_cur%FOUND LOOP; LOOP FETCH v_cur INTO v_row
-- Created on 2018/11/6 by YXQ
--顯示遊標 & 靜態遊標的處理
declare
--定義(遊標一個可以遍歷的結果集)
--宣告cursor,建立和命名一個sql工作區
--顯式遊標對應一個返回結果為多行多列的SELECT語句。
--遊標一旦開啟,資料就從資料庫中傳送到遊標變數中,然後應用程式再從遊標變數中分解出需要的資料,並進行處理。
CURSOR v_row_cur is
select * from scott.emp where empno < 7900;
v_row v_row_cur%rowtype; --用rowtype接收遍歷遊標結果集記錄
CURSOR v_id_cur IS
select empno from scott.emp where empno < 7900;
v_id_type scott.emp.empno%type; --用id%type接收遍歷遊標結果集記錄
v_num_id NUMBER(11); --用NUMBER(11)接收遍歷遊標結果集記錄
cursor v_namecn_cur is
select ename from scott.emp where empno < 7900;
v_var2_type_namecn10 varchar2(10); --用varchar2(10)接收遍歷遊標結果集記錄
v_var2_type_namecn1024 varchar2(1024); --?? varchar2(10)也全部輸出沒有擷取,varchar2(1024)也輸出
begin
--用id%type接收select結果記錄,隱式遊標 v_id_type
select empno into v_id_type from scott.emp where empno = 7788;
DBMS_OUTPUT.PUT_LINE(v_id_type);
--用NUMBER(11)接收select結果記錄,隱式遊標 v_num_id
select empno into v_num_id from scott.emp where empno = 7788;
DBMS_OUTPUT.PUT_LINE(v_num_id);
--不可以用未定義的識別符號接收select結果記錄,因為DML操作和單行SELECT語句(單行查詢操作:SELECT ... INTO ...)會使用隱式遊標
--select empno into rec from scott.emp where empno = 4593; --PLS-00201: identifier 'REC' must be declared
--DBMS_OUTPUT.PUT_LINE(rec);
--執行(常用For語句遍歷遊標)
--用rowtype接收遍歷遊標結果集記錄
FOR v_row IN v_row_cur LOOP
DBMS_OUTPUT.PUT_LINE(v_row.empno);
END LOOP;
--用id%type接收遍歷遊標結果集記錄
FOR v_id_type IN v_id_cur LOOP
DBMS_OUTPUT.PUT_LINE(v_id_type.empno);
END LOOP;
--用隱含定義的記錄變數 record_index 收遍歷遊標結果集記錄
FOR record_index IN v_id_cur LOOP
DBMS_OUTPUT.PUT_LINE(record_index.empno);
END LOOP;
--用NUMBER(11)接收遍歷遊標結果集記錄
FOR v_num_id IN v_id_cur LOOP
DBMS_OUTPUT.PUT_LINE(v_num_id.empno);
END LOOP;
--用varchar2(10)接收遍歷遊標結果集記錄
for v_var2_type_namecn10 in v_namecn_cur loop
dbms_output.put_line(v_var2_type_namecn10.ename);
end loop;
--用varchar2(1024)接收遍歷遊標結果集記錄
for v_var2_type_namecn1024 in v_namecn_cur loop
dbms_output.put_line(v_var2_type_namecn1024.ename);
end loop;
--用隱含定義的記錄變數 preod_rec 接收遍歷遊標結果集記錄
FOR preod_rec IN v_namecn_cur LOOP
DBMS_OUTPUT.PUT_LINE(preod_rec.ename);
END LOOP;
--另一種形式的遊標迴圈,該種形式更為簡單,省略了遊標的定義,遊標的SELECT查詢語句在迴圈中直接出現。
FOR preod_rec IN (select * from scott.emp where empno < 7900)
LOOP
DBMS_OUTPUT.PUT_LINE('XH匿名遊標用法:' || preod_rec.empno || ' ' || preod_rec.ename);
END LOOP;
end;
/*
隱式遊標
如前所述,DML操作和單行SELECT語句會使用隱式遊標,它們是:
* 插入操作:INSERT。
* 更新操作:UPDATE。
* 刪除操作:DELETE。
* 單行查詢操作:SELECT ... INTO ...。
當系統使用一個隱式遊標時,可以通過隱式遊標的屬性來了解操作的狀態和結果,
進而控制程式的流程。隱式遊標可以使用名字SQL來訪問,
但要注意,通過SQL遊標名總是隻能訪問前一個DML操作或單行SELECT操作的遊標屬性。
所以通常在剛剛執行完操作之後,立即使用SQL遊標名來訪問屬性。
遊標的屬性有四種,如下所示。
Sql程式碼
隱式遊標的屬性 返回值型別 意 義
SQL%ROWCOUNT 整型 代表DML語句成功執行的資料行數
SQL%FOUND 布林型 值為TRUE代表插入、刪除、更新或單行查詢操作成功
SQL%NOTFOUND 布林型 與SQL%FOUND屬性返回值相反
SQL%ISOPEN 布林型 DML執行過程中為真,結束後為假
*/