在變數宣告部分定義的游標是靜態的,不能在程式執行過程中修改。雖然可以通過引數傳遞來取得不同的資料,但還是有很大的侷限性。通過採用動態游標,可以在程式執行階段隨時生成乙個查詢語句作為游標。要使用動態游標需要先定義乙個游標型別,然後宣告乙個游標變數,游標對應的查詢語句可以在程式的執行過程中動態地說明。
定義游標型別的語句如下:
type 游標型別名 ref cursor;
宣告游標變數的語句如下:
游標變數名 游標型別名;
在可執行部分可以如下形式開啟乙個動態游標:
open 游標變數名 for 查詢語句字串;
輸入並執行以下程式:
sql**
declare
type cur_type is ref cursor;
cur cur_type;
rec scott.emp%rowtype;
str varchar2(50);
letter char:= 'a';
begin
loop
str:= 'select ename from emp where ename like '
'%'||letter||'%'
'';
open cur for str;
dbms_output.put_line('包含字母'||letter||'的名字:');
loop
fetch cur into rec.ename;
exit when cur%notfound;
dbms_output.put_line(rec.ename);
end loop;
exit when letter='z';
letter:=chr(ascii(letter)+1);
end loop;
end;
當執行一條dml語句後,dml語句的結果儲存在四個游標屬性中,這些屬性用於控制程式流程或者了解程式的狀態。當執行dml語句時,pl/sql開啟乙個內建游標並處理結果,游標是維護查詢結果的記憶體中的乙個區域,游標在執行dml語句時開啟,完成後關閉。隱式游標只使用sql%found,sql%notfound,sql%rowcount三個屬性.sql%found,sql%notfound是布林值,sql%rowcount是整數值。
sql%found和sql%notfound
在執行任何dml語句前sql%found和sql%notfound的值都是null,在執行dml語句後,sql%found的屬性值將是:
. true :insert
. true :delete和update,至少有一行被delete或update.
. true :select into至少返回一行
當sql%found為true時,sql%notfound為false。
sql%rowcount
在執行任何dml語句之前,sql%rowcount的值都是null,對於select into語句,如果執行成功,sql%rowcount的值為1,如果沒有成功,sql%rowcount的值為0,同時產生乙個異常no_data_found.
sql%isopen
sql%isopen是乙個布林值,如果游標開啟,則為true, 如果游標關閉,則為false.對於隱式游標而言sql%isopen總是false,這是因為隱式游標在dml語句執行時開啟,結束時就立即關閉。
游標的幾種寫法
select empno,ename,job,sal from emp for 游標 declare 定義游標 cursor c man is select from emp where job manager 定義游標的行 在for語句中,這個可以不用定義 c row c man rowtype ...
sql語句游標的寫法
當迴圈查詢一張表的資訊時,我們得寫一張游標來對每條資訊進行操作,具體格式如下 declare fitemid int declare point cursor cursor forselect fitemid from icstockbillentry where finterid 1314 每條資...
Oracle 動態游標的用法
oracle動態游標的簡單實現方法 下面就是例子程式 明細表列印予處理 通用報表 procedure mx print common pd id in mx pd syn.pd id type,p pd mxb id in mx pd mxb syn.p mxb id type,p dept no ...