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 <record_index> IN <cursor_name>
LOOP
<executable statements>
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 <ref_cursor_name> IS REF CURSOR [RETURN <return_type>];
用于聲明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語句字符串'
新聞熱點
疑難解答