EXECUTE IMMEDIATE PL / SQL块返回类型

时间:2016-06-30 20:55:12

标签: sql oracle plsql

作为测试的一部分,我想使用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;
/

1 个答案:

答案 0 :(得分:8)

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;