23.2.7游標變數
游標變數也可以處理多行查詢結果集。游標變數的定義包括兩個步驟: (1
)定義cursor
型別的指標
語法:type ref_cursor_name is ref cursor[return return_type]
舉例:type var_cursor_name is ref cursor; (2
)定義ref cursor
型別的變數
v_rc var_cursor_name;
綜合寫法如下:
type var_cursor_name is ref cursor;
v_rc var_cursor_name;
上面的綜合宣告的游標變數稱為弱ref cursor
型別,因為它沒有指明游標返回的結果,因此它可以指向任何乙個具有多列的select
查詢結果。相對於上面還有一種稱為強ref cursor
型別。
宣告方式如下:
type varcursorname is ref cursor return emp%rowtype; //
指明了返回的結果
vcn varcursorname; //
宣告乙個強的ref cursor
型別的變數
使用游標變數與游標使用方式一樣,也需要宣告,開啟,檢索,關閉游標變數。
23.2.8綜合案例
sql> declare
2 3 type emp_cname is ref cursor return emp%rowtype; //宣告游標變數第一步
4 5 ecname emp_cname; //宣告游標變數第二步
6 7 emp_row emp%rowtype; //宣告用於儲存檢索資料的變數
8 9 begin
10 dbms_output.put_line('開始');
11 open ecname for select * from emp where empno=7934; //開啟游標變數
12 loop
13 fetch ecname into emp_row; //查詢結果賦值給儲存的變數
14 exit when ecname%notfound; //退出條件
15 dbms_output.put_line(emp_row.ename); //輸出結果
16 end loop; //退出迴圈
17 close ecname; //關閉游標變數
18 dbms_output.put_line('結束');
19 end;
20 /
開始miller
結束
//複雜的案例(游標的迴圈遍歷)
sql> declare
2 3 type emp_cname is ref cursor return emp%rowtype;
4 5 ecname emp_cname;
6 7 emp_row emp%rowtype;
8 9 begin
10 dbms_output.put_line('開始');
11 open ecname for select * from emp;
12 loop
13 fetch ecname into emp_row;
14 exit when ecname%notfound;
15 dbms_output.put_line(emp_row.ename);
16 end loop;
17 close ecname;
18 dbms_output.put_line('結束');
19 end;
20 /
開始smith
allen
ward
jones
martin
blake
clark
scott
king
turner
adams
james
ford
miller
結束
23.29
使用游標更新資料庫
定位游標之後就可以進行刪除(
修改)指定的資料行。更新的時候需要使用for update
選項,語法如下:
cursor cursor_name is select_statement;
for update[of column[,column],[nowait]]
of用來指定要鎖定的列,如果忽略of
那麼表中選擇的資料行都將鎖定。如果被鎖定行已經被鎖定了,那麼必須等待釋放才能鎖定對於這種情況我們可以使用nowait
語句。
當使用for update
語句宣告游標後,
可以再delete|update
語句中使用where current of
子句,修改|
刪除游標結果集中當前行對應的表中的資料。
語法如下:
where
舉例說明:
sql> declare
2 3 cursor ecname is select * from emp where empno=7934
4 for update of sal nowait;
5 6 esal number(7,2);
7 8
9 begin
10 dbms_output.put_line('開始');
11
12 for r in ecname loop
13 esal:=r.sal*10;
14 update emp set sal=esal where current of ecname;
15 end loop;
16
17 dbms_output.put_line('結束');
18 end;
19 /
開始結束
Oracle 10g資料庫管理
oracle 10g資料庫管理 課程介紹 本課程面向企業 oracle 10g 資料庫管理的學員。通過 oracle 10g 資料庫管理課程的系統培訓,使學員能夠在較短的時間內掌握 oralcle10g 資料庫管理和維護的各種技術,從而掌握最新版 oracle 的新特性和 oracle 資料通用技術...
Oracle 10g資料庫管理 應用與開發 五
3 日期時間函式,oracle 中的日期型資料實際含有兩個值 日期和時間。預設的日期格式是dd mon rr.日期時間函式用來返回當前系統的日期和時間 以及對日期和時間型別的資料進行處理運算。add months date,count 在指定的日期上增加count個月 last day date 返...
Oracle 10g資料庫管理 應用與開發 八
十 六 修改sql資料 dml data manipulation language 執行資料操作任務的語言,dml也是pl sql語言的重要組成部分。常用的dml語言包括insert update delete語句,它們分別完成了對資料庫的新增 修改和刪除等操作。1 新增資料 1.1簡單的inse...