在PLSQL中使用EXECUTEIMMEDIATE語句處理動態SQL語句。
語法如下:
EXECUTEIMMEDIATEdynamic_string
[INTO{define_variable[,define_variable]...|record}]
[USING[IN|OUT|INOUT]bind_argument
[,[IN|OUT|INOUT]bind_argument]...]
[{RETURNING|RETURN}INTObind_argument[,bind_argument]...];
dynamic_string是代表一條SQL語句或一個PL/SQL塊的字串表示式,
define_variable是用於存放被選出的欄位值的變數,
record是使用者定義或%ROWTYPE型別的記錄,用來存放被選出的行記錄。
輸入bind_argument引數是一個表示式,它的值將被傳入(IN模式)或傳出(OUT模式)或先傳入再傳出(INOUT模式)到動態SQL語句或是PL/SQL塊中。一個輸出bind_argument引數就是一個能儲存動態SQL返回值的變數。
除了多行查詢外,動態字串可以包含任何SQL語句(不含終結符)或PL/SQL塊(含終結符)。
字串中可以包括用於引數繫結的佔位符。
但是,不可以使用繫結引數為動態SQL傳遞模式物件。
在用於單行查詢時,INTO子句要指明用於存放檢索值的變數或記錄。
對於查詢檢索出來的每一個值,INTO子句中都必須有一個與之對應的、型別相容的變數或欄位。
在用於DML操作時,RETURNINGINTO子句要指明用於存放返回值的變數或記錄。
對於DML語句返回的每一個值,INTO子句中都必須有一個與之對應的、型別相容的變數或欄位。
我們可以把所有的繫結引數放到USING子句中。預設的引數模式是IN。
對於含有RETURNING子句的DML語句來說,我們可以把OUT引數放到RETURNINGINTO之後,並且不用指定它們的引數模式,因為預設就是OUT。
如果我們既使用了USING又使用RETURNINGINTO,那麼,USING子句中就只能包含IN模式的引數了。
執行時,動態字串中的繫結引數會替換相對應的佔位符。所以,每個佔位符必須與USING子句和/或RETURNINGINTO子句中的一個繫結引數對應。我們可以使用數字、字元和字串作為繫結引數,但不能使用布林型別(TRUE,FALSE和NULL)。要把空值傳遞給動態字串,我們就必須使用工作區。
動態SQL支援所有的SQL型別。所以,定義變數和繫結變數都可以是集合、LOB,物件型別例項和引用。
作為一項規則,動態SQL是不支援PL/SQL特有的型別的。這樣,它就不能使用布林型或索引表。
我們可以重複為繫結變數指定新值執行動態SQL語句。但是,每次都會消耗很多資源,因為EXECUTEIMMEDIATE在每次執行之前都需要對動態字串進行預處理。
在PLSQL中使用EXECUTEIMMEDIATE語句處理動態SQL語句。
語法如下:
EXECUTEIMMEDIATEdynamic_string
[INTO{define_variable[,define_variable]...|record}]
[USING[IN|OUT|INOUT]bind_argument
[,[IN|OUT|INOUT]bind_argument]...]
[{RETURNING|RETURN}INTObind_argument[,bind_argument]...];
dynamic_string是代表一條SQL語句或一個PL/SQL塊的字串表示式,
define_variable是用於存放被選出的欄位值的變數,
record是使用者定義或%ROWTYPE型別的記錄,用來存放被選出的行記錄。
輸入bind_argument引數是一個表示式,它的值將被傳入(IN模式)或傳出(OUT模式)或先傳入再傳出(INOUT模式)到動態SQL語句或是PL/SQL塊中。一個輸出bind_argument引數就是一個能儲存動態SQL返回值的變數。
除了多行查詢外,動態字串可以包含任何SQL語句(不含終結符)或PL/SQL塊(含終結符)。
字串中可以包括用於引數繫結的佔位符。
但是,不可以使用繫結引數為動態SQL傳遞模式物件。
在用於單行查詢時,INTO子句要指明用於存放檢索值的變數或記錄。
對於查詢檢索出來的每一個值,INTO子句中都必須有一個與之對應的、型別相容的變數或欄位。
在用於DML操作時,RETURNINGINTO子句要指明用於存放返回值的變數或記錄。
對於DML語句返回的每一個值,INTO子句中都必須有一個與之對應的、型別相容的變數或欄位。
我們可以把所有的繫結引數放到USING子句中。預設的引數模式是IN。
對於含有RETURNING子句的DML語句來說,我們可以把OUT引數放到RETURNINGINTO之後,並且不用指定它們的引數模式,因為預設就是OUT。
如果我們既使用了USING又使用RETURNINGINTO,那麼,USING子句中就只能包含IN模式的引數了。
執行時,動態字串中的繫結引數會替換相對應的佔位符。所以,每個佔位符必須與USING子句和/或RETURNINGINTO子句中的一個繫結引數對應。我們可以使用數字、字元和字串作為繫結引數,但不能使用布林型別(TRUE,FALSE和NULL)。要把空值傳遞給動態字串,我們就必須使用工作區。
動態SQL支援所有的SQL型別。所以,定義變數和繫結變數都可以是集合、LOB,物件型別例項和引用。
作為一項規則,動態SQL是不支援PL/SQL特有的型別的。這樣,它就不能使用布林型或索引表。
我們可以重複為繫結變數指定新值執行動態SQL語句。但是,每次都會消耗很多資源,因為EXECUTEIMMEDIATE在每次執行之前都需要對動態字串進行預處理。