PLSQL Language Referenc-PL/SQL動態SQL-動態SQL中重複的佔位符名名稱

LuiseDalian發表於2014-03-18

動態SQL中重複的佔位符名名稱

如果在動態SQL中重複使用佔位符名,必須清楚佔位符與繫結變數關聯的方式是依賴於動態SQL的型別的。

n  動態SQL語句不是匿名塊或呼叫語句

則佔位符名重複是無關緊要的。在USING子句中的佔位符與繫結變數的關聯是通過位置,而不是名字。

sql_stmt := 'INSERT INTO payroll VALUES (:x, :x, :y, :x)';

EXECUTE IMMEDIATE sql_stmt USING a, b, c, d;

-- 具體執行的SQL語句為

INSERT INTO payroll VALUES (a, b, c, d);

 

-- 把相同的繫結變數關聯到同一定位符,也是需要多次指定

EXECUTE IMMEDIATE sql_stmt USING a, a, b, a;

-- 具體執行的SQL語句為

INSERT INTO payroll VALUES (a, a, b, a);

 

n  動態SQL語句是匿名塊或呼叫語句

USING子句中每1個唯一的佔位符,必須有一個對應的繫結變數。如果重複了佔位符名,則不需要重複對應的繫結變數。這些佔位符會引用同一個繫結變數。

 

練習:動態SQL中重複的佔位符

-- 11g12_07_05.prc

CREATE PROCEDURE calc_stats (

    w NUMBER,

    x NUMBER,

    y NUMBER,

    z NUMBER )

IS

BEGIN

    DBMS_OUTPUT.PUT_LINE(w + x + y + z);

END;

 

 

-- 11g12_07_05.tst

DECLARE

    a NUMBER := 4;

    b NUMBER := 7;

    plsql_block VARCHAR2(100);

BEGIN

    plsql_block := 'BEGIN calc_stats(:x, :x, :y, :x); END;';   

    EXECUTE IMMEDIATE plsql_block USING a, b; 

    -- 實際執行的為: calc_stats(a, a, b, a);

END;

    -- 結果為:19

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/17013648/viewspace-1123734/,如需轉載,請註明出處,否則將追究法律責任。

相關文章