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


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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM