【发布时间】:2018-01-12 11:11:48
【问题描述】:
我刚刚开始学习这门语言。 我试图使用一个包含 PL/SQL 块的字符串和一个占位符字符串,该字符串有两个字段,我想用从 SELECT 语句中检索到的一些数据替换它们。
我已正确创建并填充了表 employees。
问题是我需要“替换”那些占位符(变量cmd2 中的:name 和:salary)但是当我EXECUTE IMMEDIATE 使用检索到的值时出现此错误:ORA-01006: bind variable does not exist。
这是代码sn-p:
DECLARE
cmd1 VARCHAR2(200) := 'SELECT * FROM employees';
cmd2 VARCHAR2(200) := 'BEGIN DBMS_OUTPUT.PUT_LINE('':name has a salary of :salary;''); END;';
str VARCHAR2(200);
c1 SYS_REFCURSOR;
emp employees%ROWTYPE;
BEGIN
OPEN c1 FOR cmd1;
LOOP
FETCH c1 INTO emp;
EXIT WHEN c1%NOTFOUND;
-- It doesn't work
EXECUTE IMMEDIATE cmd2 USING emp.name, emp.salary;
-- It works, but just prints ':name has a salary of :salary;'
EXECUTE IMMEDIATE cmd2;
END LOOP;
END;
预期的结果应该是:
Name1 has a salary of 300;
Name2 has a salary of 700;
-- ...and so on
【问题讨论】:
-
即使您接受了理想情况下不适合您的问题的答案,我还是想说,绑定变量应用程序仅适用于
DBMS_OUTPUT语句。 -
@XING 为您的答案添加了引用。
-
如果您接受任何可以以某种方式解决您的问题但可能会误导概念点的答案,那么问题的重要性就会降低。如果您添加任何引号无关紧要,因为这样的人看的是答案而不是问题
-
"绑定变量仅在 PLSQL 块内的 SQL 语句中使用。"虽然是错误的,但它们也用于过程调用以传递参数 - 请参阅许多示例 here in Oracle docs。而
DBMS_OUTPUT.PUT_LINE是一个过程调用,就像其他的一样! -
在动态过程调用中在串联字符串中使用绑定变量可能是不寻常的,但它完全有效(如果必须的话),所以我认为警告是不正确的。