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 更改为CLOBBLOBNUMBER 并且没有任何变化。有什么想法吗?

好的,这是另一个例子,结果相同。

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的用法 谁给解释下

从存储过程调用时,PL SQL Execute Immediate 不起作用

Oracle 11 PL SQL 使用 Execute Immediate 为变量赋值