EXECUTE IMMEDIATE PL/SQL 块返回类型
Posted
技术标签:
【中文标题】EXECUTE IMMEDIATE PL/SQL 块返回类型【英文标题】:EXECUTE IMMEDIATE PL/SQL Block return type 【发布时间】:2016-06-30 20:55:11 【问题描述】:作为测试的一部分,我想使用 EXECUTE IMMEDIATE
运行 PL/SQL 块,但是当我尝试使用 INTO
获取结果时,无论我想要的 PL/SQL 块的内容如何,它总是返回相同的错误运行。
DECLARE
l_output VARCHAR2(10);
BEGIN
EXECUTE IMMEDIATE 'BEGIN COMMIT; END;' INTO l_output;
END;
/
错误是
ORA-01007: variable not in select list
我知道此错误与l_output
的类型与EXECUTE IMMEDIATE
的返回类型不同,但我不知道类型。我已经尝试将l_output
更改为CLOB
、BLOB
、NUMBER
并且没有任何变化。有什么想法吗?
好的,这是另一个例子,结果相同。
DECLARE
l_output VARCHAR2(10);
BEGIN
EXECUTE IMMEDIATE 'BEGIN DBMS_OUTPUT.PUT_LINE(''TEST''); END;' INTO l_output;
END;
/
【问题讨论】:
您调用的匿名块没有任何要返回的绑定变量...您希望返回什么? 如果您只是检查 EXECUTE IMMEDIATE 是否成功,请尝试将其包装在 BEGIN ... EXCEPTION ... END 块中。 至于您的编辑,我认为 Oracle plsql 中不存在这样的功能。将文本输出捕获到屏幕不存在,因为它取决于 client 如何呈现结果。例如,如果在 SQL*Plus 中执行DBMS_OUTPUT.PUT_LINE('TEST')
而设置了 SET SERVEROUTPUT OFF
,则输出将为空,但 Oracle 无法知道这一点。
PL/SQL 块没有返回类型。你能解释一下你到底想要做什么以及为什么?如果您正在尝试构建一个通用的“运行任何命令,返回结果”系统,有办法做到这一点。
【参考方案1】:
Oracle 抱怨是因为您的 PL/SQL 没有返回任何内容供它存储在 l_output
中。您期望l_output
的值是多少?
人们可以使用EXECUTE IMMEDIATE
...INTO
和类似的东西从PL/SQL 块中返回一个值。
DECLARE
l_output VARCHAR2(10);
BEGIN
EXECUTE IMMEDIATE 'SELECT ''ABC'' FROM DUAL' INTO l_output;
dbms_output.put_line('l_output = ' || l_output);
END;
/
更新
如果你愿意,你可以这样做:
DECLARE
l_output VARCHAR2(10);
BEGIN
EXECUTE IMMEDIATE 'BEGIN :1 := 5; END;' USING IN OUT l_output;
dbms_output.put_line('l_output = ' || l_output);
END;
【讨论】:
nop,我需要命令是 PL/SQL 块,而不是直接的 DDL 指令,我只是添加了另一个示例 您的第二个示例也不返回任何内容。就 PL/SQL 而言,发送到DBMS_OUTPUT
的文本不是“返回值”。相反,它是您的客户端可以在 PL/SQL 完全执行完后读取和显示的内容。但是,我已经更新了我的答案,以说明如何从 PL/SQL 返回一个值,如果你真的有的话。
是的,我们认为这可以解决问题,同样对于我们考虑插入表格的更复杂的问题,在EXECUTE
语句之后我们可以查找它以上是关于EXECUTE IMMEDIATE PL/SQL 块返回类型的主要内容,如果未能解决你的问题,请参考以下文章
PL/SQL ORA-00903: EXECUTE IMMEDIATE 期间表名无效
Oracle PL SQL - EXECUTE IMMEDIATE 的问题
为 EXECUTE IMMEDIATE 解析 PL/SQL 语句中的占位符
PL/SQL里 execute immediate的用法 谁给解释下