在PL SQL使用游標獲取資料及動態SQL

2022-08-27 20:15:08 字數 3026 閱讀 7432

1.游標概念:

當在pl/sql塊中執行dml(增刪改)時,oracle會為其分配上下文區(context area),游標是指向上下文區的指標

2.  游標分類:

a.  隱式游標

a.  在pl/sql中使用dml語句時自動建立隱式游標

b.  隱式游標自動宣告、開啟和關閉,其名為 sql

c.  通過檢查隱式游標的屬性可以獲得最近執行的dml 語句的資訊

d.  隱式游標的屬性有:

%found – sql 語句影響了一行或多行時為 true

%notfound – sql 語句沒有影響任何行時為true

%rowcount – sql 語句影響的行數

%isopen  - 游標是否開啟,始終為false

e. 隱式游標的錯誤處理:no_data_found:沒有查詢到任何行。too_many_rows:返回多行。

b.  顯式游標

a.  顯式 游標的使用步驟:

1)  聲明顯式游標語法:

cursor  游標名[(游標引數列表)] [return  返回值規範]   is   select 語句   [for   update  of   [列名列表]];

2)  開啟顯式游標語法:

open  顯式游標名 (引數列表);

3)   提取資料語法:

fetch   游標名   into   記錄或變數列表;

4)   關閉游標語法:

close   游標名;

b.  顯式游標屬性

顯式游標名%屬性

%found – sql 語句影響了一行或多行時為 true

%notfound – sql 語句沒有影響任何行時為true

%rowcount – sql 語句影響的行數

%isopen  - 游標是否開啟,始終為false

3. 迴圈游標 :

用於簡化游標處理**、當使用者需要從游標中提取所有記錄時使用

迴圈游標的語法如下:

for in

loop

end loop;

4. bulk collect

為什麼要使用bulk collect?

提交pl/sql中select語句的查詢效率。

原理:減少了pl/sql與sql引擎之間的開關次數,因而加速了資料獲取的速度

語法:... bulk collect into 集合

5. ref 游標和游標變數:用於處理執行時動態執行的 sql 查詢

使用游標變數的步驟:

a.  建立游標變數需要兩個步驟:

a.  宣告 ref 游標型別

b.  宣告 ref 游標型別的變數

用於宣告 ref 游標型別的語法為:

type is ref cursor  [return ];

用於宣告ref 游標型別變數的語法:變數名   游標型別名;

b.  開啟游標變數的語法如下:

open cursor_name for select_statement;

c.  提取資料語法:

a.  fetch  游標變數名   into   接收游標資料的變數 ……;

b.  fetch   游標變數名  into  接收游標結果的集合變數  ….[limit  rows];

d.  關閉游標變數語法:close   游標變數名 ;

6.  游標變數的優點和限制

a.  游標變數的優點有:

a. 可從不同的 select 語句中提取結果集

b. 可以作為過程的引數進行傳遞

c. 可以引用游標的所有屬性

d. 可以進行賦值運算

b.  使用游標變數的限制:

a. 不能在程式包中宣告游標變數

b. for update子句不能與游標變數一起使用

c. 不能使用比較運算子

7.  動態sql概述

a.  繫結

a.  編譯器識別程式中的識別符號儲存位置的過程。

b.  分類:早期繫結與晚期繫結

b.  動態 sql 是指在pl/sql程式執行時生成的 sql 語句

c.  ddl 語句命令和會話控制語句不能在 pl/sql 中直接使用,但是可以通過動態 sql 來執行

d.  兩種動態sql技術

a.  dbms_sql包:oracle 8i以前使用。

b.  本地動態sql:oracle 9i以後使用。

對比:本地動態sql更簡單、執行更快。

e.  執行動態sql

a.  語法1:execute immediate 'sql語句字串'

b.  語法2:open x for 'sql語句字串'

8.  繫結變數

a.  為什麼使用繫結變數:減少編譯sql的次數,提交執行效率

b.  繫結變數說明

execute immediate

'insert into t1(f1,f2) values(:a,:b)' using x,y;

注意: using後面的變數與繫結變數根據位置一一對應。  x-->a、y-->b

c.  繫結變數的使用

a. 在sql*plus(命令視窗) 中使用繫結變數

只能在sql*plus互動環境下使用。

b. 在pl/sql(儲存過程和函式)中使用繫結變數

引數引用的已經是繫結變數。

c.  在動態sql中使用繫結變數

只能繫結字面量(替換具體的值)

不能替換資料庫物件名稱

d.  在jdbc中使用繫結變數

preparedstatement物件

9. 動態sql語法

語法1:execute immediate 'sql語句字串'

語法2:open for 'sql語句字串'

PL SQL 引用游標的使用

使用引用游標的情景 1.你可能有這樣的需求 讓乙個函式返回乙個游標,然後宿主函式呼叫並使用這個游標 2.open cursor name for v sql statement 當時用動態sql進行多行查詢時,因為此處的cursour name必須是乙個游標變數,所以需要使用。h還可檢視例子 cre...

pl sql 使用游標屬性,案例

使用游標 1 顯示游標 cursor name cursor is select statement 2 開啟游標 open name cursor 3 提取游標 fetch name cursor into variable1,variable2.4 關閉游標 close name cursor ...

顯示游標獲取資料 PL SQL

在oracle中,當我們從pl sql中執行一條select語句時,oracle rdbms 關聯式資料庫管理系統 會為該語句在sga的共享池中分配乙個私有sql區,同時在將查詢結果集放入系統全域性區sga中,以提高訪問和修改結果集的效能。私有sql區包含了該語句的資訊以及結果集的資訊。oracle...