#靜態游標指的是程序執行的時候不需要再去解析sql語言,對於sql語句的解析在編譯的時候就可以完成的。
動態游標由於含有參數,對於sql語句的解析必須要等到參數確定的時候才能完成。
從這個角度來說,靜態游標的效率也比動態游標更高一些。
#游標的相關概念:
定義:
游標它是一個服務器端的存儲區,這個區域提供給用戶使用,在這個區域里
存儲的是用戶通過一個查詢語句得到的結果集,用戶通過控制這個游標區域當中
的指針 來提取游標中的數據,然后來進行操作。
實質:
是用戶在遠程客戶端上對服務器內存區域的操作,由數據庫為用戶提供這樣的
一個指針,使得用戶能夠去檢索服務器內存區的數據。
#游標具有的屬性:
1、%ISOPEN(確定游標是否已經打開 true or false)
2、%FOUND(返回是否從結果集提取到了數據 true or false)
3、%NOTFOUND(返回是否從結果集沒有提取到數據 true or false)
4、%ROWCOUNT(返回到當前為止已經提取到的實際行數)
#游標分類
一、靜態游標
1、隱式游標:
對於select..into...語句,一次只能從數據庫中獲取到一條數據,對於這種類型的DML SQL語句,就是隱式cursor
select update/insert/delete操作
2、顯示游標:
由程序員定義和管理,對於從數據庫中提取多行數據,就需要使用顯式cursor
1)定義游標---cursor [cursor name] is
2)打開游標---open [cursor name]
3)操作數據---fetch [cursor name]
4)關閉游標---close [cursor name]
二、REF游標
1、REF 游標:動態關聯結果集的臨時對象。即在運行的時候動態決定執行查詢。
2、REF 游標作用:實現在程序間傳遞結果集的功能,利用REF CURSOR也可以實現BULK SQL,從而提高SQL性能。
3、靜態游標和REF 游標的區別:
①靜態游標是靜態定義,REF 游標是動態關聯;
②使用REF 游標需REF 游標變量。
③REF 游標能做為參數進行傳遞,而靜態游標是不可能的。
4、REF 游標變量:是一種引用REF游標類型的變量,指向動態關聯的結果集。
5、怎么使用REF游標:
①聲明REF 游標類型,確定REF 游標類型;
⑴強類型REF游標:指定retrun type,REF 游標變量的類型必須和return type一致。
語法:Type REF游標名 IS Ref Cursor Return 結果集返回記錄類型;
⑵弱類型REF游標:不指定return type,能和任何類型的CURSOR變量匹配,用於獲取任何結果集。
語法:Type REF游標名 IS Ref Cursor;
②聲明Ref 游標類型變量;
語法:變量名 已聲明Ref 游標類型;
③打開REF游標,關聯結果集 ;
語法:Open Ref 游標類型變量 For 查詢語句返回結果集;
④獲取記錄,操作記錄;
語法:Fatch REF游標名 InTo 臨時記錄類型變量或屬性類型變量列表;
⑤關閉游標,完全釋放資源;
語法:Close REF游標名;
例:
SQL> declare
2 type emp_cursor is ref cursor;
3 my_cursor emp_cursor;
4 v_ename emp.ename%type;
5 v_sal emp.sal%type;
6 v_deptno dept.deptno%type := &p_deptno;
7 v_dname dept.dname%type;
8 begin
9 select dname into v_dname from dept where deptno = v_deptno;
10 dbms_output.put_line('Department:' || v_dname);
11 open my_cursor for
12 select ename, sal from emp where deptno = v_deptno;
13 loop
14 fetch my_cursor
15 into v_ename, v_sal;
16 exit when my_cursor%notfound;
17 dbms_output.put_line('--name:' || v_ename || 'salary:' || v_sal);
18 end loop;
19 close my_cursor;
20 end;
21 /
Enter value for p_deptno: 30
old 6: v_deptno dept.deptno%type := &p_deptno;
new 6: v_deptno dept.deptno%type := 30;
Department:SALES
--name:ALLENsalary:1600
--name:WARDsalary:1250
--name:MARTINsalary:1250
--name:BLAKEsalary:2850
--name:TURNERsalary:1500
--name:JAMESsalary:950
PL/SQL procedure successfully completed.