1. 程式人生 > >『ORACLE』 PLSQL動態遊標的使用(11g)

『ORACLE』 PLSQL動態遊標的使用(11g)

not 弱類型 return als rtm 釋放 success 存儲 一個

#靜態遊標指的是程序執行的時候不需要再去解析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.

『ORACLE』 PLSQL動態遊標的使用(11g)