动态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/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/17013648/viewspace-1123734/