動態SQL是在運行時生成和執行SQL語句的編程方法。動態是和靜態相對而言的。靜態SQL指的是在代碼編譯時刻就已經包含在代碼中的那些已經充分明確的固定的SQL語句。
PL/SQL提供了兩種方式來編寫動態SQL:
- 本地動態SQL,一個PL/SQL語言結構用於構建和指定動態SQL語句。
- DBMS_SQL包,一個API用戶構建、執行和描述動態SQL語句。
本地動態SQL代碼比同等代碼使用DBMS_SQL包更容易讀和寫,運行數據更快。然而,編寫本地動態SQL,你必須知道在運行時動態SQL語句的輸入和輸出的變量類型和數量。如果在運行你不知道這種信息,就必須使用DBMS_SQL包。
下面主要介紹本地動態SQL語句的語法。
1.EXECUTE IMMEDIATE語句
1.1語法
execute_immediate_statement ::=
into_clause ::=
bulk_collect_into_clause ::=
using_clause ::=
dynamic_returning_clause ::=
into_clause ::=
bulk_collect_into_clause ::=
1.2關鍵字和參數描述
- bind_argument
一個傳遞到動態SQL語句的表達式值(IN綁定),或是一個存儲動態SQL語句返回值的變量(OUT綁定)。
- BULK COLLECT INTO
如果使用僅當動態SQL語句可以返回多行,此子句指定一個或多個集合存儲返回行。該子句必須有一個相應的兼容型集合或數組來存儲動態SQL語句的查詢列。
- collection_name
一個聲明的集合,用來存儲動態SQL語句返回行。
- dynamic_returning_clause
如果使用僅當動態SQL語句有 RETURNING INTO子句,這個子句返回動態SQL語句受影響行的列值,獨立變量或記錄。該子句可以包括OUT綁定參數。
- dynamic_sql_stmt
一個字符串常量,字符串變量,或表示SQL語句的字符串表達式,必須是CHAR、VARCHAR2或者CLOB類型。
- host_array_name
返回行數組進行存儲,該數組必須聲明一個PL / SQL主機環境中,並傳遞給PL/ SQL綁定參數(冒號(:)前綴)
- IN, OUT, IN OUT
綁定參數的參數模式,IN綁定參數傳遞值到動態SQL語句,OUT綁定參數存儲動態SQL語句返回值。IN OUT綁定參數傳遞初始值到動態SQL語句,並存儲動態SQL語句返回值。默認綁定參數的參數模式是IN。
- INTO
當且僅當動態SQL語句是一個SELECT語句,最多可以返回一行。此子句指定變量或記錄存儲返回行的列值。對於每個動態SQL語句查詢列,必須有相應的自定義變量兼容類型和記錄兼容類型。
- record_name
存儲返回行的用戶自定或%rowtype記錄。
- USING
當且僅當動態SQL語句包含佔位符,指定綁定參數列表。
使用事項:
對於有 RETURNING
子句的DML語句,你可以把OUT綁定參數放到 RETURNING
INTO
子句中,無需指定參數模式。如果同時使用USING子句和 RETURNING
INTO
子句,USING子句只能包含IN參數。
綁定參數值不能是布爾字面量(TRUE,FALSE,NULL)。如果想要傳遞NUL值到動態SQL,可以使用未初始化變量。
2.OPEN FOR語句
OPEN-FOR語句執行遊標變量相關的SELECT語句。
2.1.語法
open_for_statement ::=
using_clause ::=
2.2.關鍵字和參數描述
- cursor_variable_name
當前作用域內已申明的遊標變量或者無返回類型的遊標參數。
- host_cursor_variable_name
必須在PL/SQL主機環境已被申明,並通過PL/SQL作爲綁定參數的遊標變量。遊標變量的數據裏類型必須兼容任何PL/SQL遊標變量的返回類型。
- select_statement
一個字符串常量,字符串變量,或字符串表達式,表示多行的SELECT語句(不包括最後的分號)與cursor_variable_name相關。它必須是類型爲CHAR,VARCHAR2,CLOB(NCHAR或NVARCHAR2)。
- dynamic_string
一個字符串常量,字符串變量,或字符串表達式,表示任何SQL語句。它必須是類型爲CHAR,VARCHAR2,CLOB。、
- USING
當且僅當select_statment包括佔位符,此子句指定綁定參數列表。
- bind_argument
一個傳遞到動態SQL語句的表達式值(IN綁定),或是一個存儲動態SQL語句返回值的變量(OUT綁定)。默認綁定參數模式是IN。