ITPub博客

首页 > 数据库 > Oracle > PLSQL Language Referenc-PL/SQL动态SQL-动态SQL中重复的占位符名名称

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

原创 Oracle 作者: luisedalian 时间:2014-03-18 07:19:21 0 删除 编辑

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

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    1986
  • 访问量
    5675878