PLSQL Language Referenc-PL/SQL动态SQL-动态SQL中重复的占位符名名称

动态SQL中重复的占位符名名称

如果在动态SQL中重复使用占位符名,必须清楚占位符与绑定变量关联的方式是依赖于动态SQL的类型的。

动态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);

 

动态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/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/17013648/viewspace-1123734/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值