回覆列表
  • 1 # 南風微涼一夢花開

    在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在每次執行之前都需要對動態字串進行預處理。

  • 中秋節和大豐收的關聯?
  • 你覺得粉一個明星能得到什麼?