EXECUTE IMMEDIATE PL/SQL块返回类型

Jor*_*tes 3 sql oracle plsql

作为测试的一部分,我想使用PL/SQL块运行,EXECUTE IMMEDIATE但是当我尝试使用INTO它获取结果时,无论我想运行的PL/SQL块的内容如何,它总是返回相同的错误.

DECLARE
    l_output    VARCHAR2(10);
BEGIN
    EXECUTE IMMEDIATE 'BEGIN COMMIT; END;' INTO l_output;
END;
/
Run Code Online (Sandbox Code Playgroud)

错误是

ORA-01007: variable not in select list
Run Code Online (Sandbox Code Playgroud)

我知道这个错误必须与l_output返回类型不同EXECUTE IMMEDIATE,但我不知道类型.我已经试图改变l_outputCLOB,BLOB,NUMBER并没有什么变化.任何的想法?

好的,这是另一个例子,同样的结果.

DECLARE
    l_output    VARCHAR2(10);
BEGIN
    EXECUTE IMMEDIATE 'BEGIN DBMS_OUTPUT.PUT_LINE(''TEST''); END;' INTO l_output;
END;
/
Run Code Online (Sandbox Code Playgroud)

Mat*_*eak 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;
/
Run Code Online (Sandbox Code Playgroud)

UPDATE

如果你愿意,你可以这样做:

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;
Run Code Online (Sandbox Code Playgroud)