执行即时PL/SQL块返回类型
作为测试的一部分,我希望使用执行即时PL/SQL块返回类型,sql,oracle,plsql,Sql,Oracle,Plsql,作为测试的一部分,我希望使用executeimmediate运行PL/SQL块,但是当我尝试使用将结果提取到中时,无论我要运行的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
executeimmediate
运行PL/SQL块,但是当我尝试使用将结果提取到中时,无论我要运行的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_输出
与executeimmediate
返回的类型不同,但我不知道类型。我已经尝试将l_输出
更改为CLOB
,BLOB
,NUMBER
,但没有任何更改。有什么想法吗
好的,这是另一个例子,相同的结果
DECLARE
l_output VARCHAR2(10);
BEGIN
EXECUTE IMMEDIATE 'BEGIN DBMS_OUTPUT.PUT_LINE(''TEST''); END;' INTO l_output;
END;
/
Oracle之所以抱怨,是因为您的PL/SQL没有返回任何内容以存储在l\u输出中。您希望l\u输出的值是多少
我们可以使用executeimmediate
…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;
您正在调用的匿名块没有任何要返回的绑定变量。。。您希望返回什么?如果您只是检查EXECUTE IMMEDIATE是否成功,请尝试将其包装在BEGIN中。。。例外。。。至于您的编辑,我认为Oracle plsql中不存在这样的功能。捕获文本输出到屏幕不存在,因为它取决于客户端呈现结果的方式。例如,如果在SQL*Plus中执行DBMS\u OUTPUT.PUT\u LINE('TEST')
,而设置SET SERVEROUTPUT OFF
,则输出将为空,但Oracle无法知道这一点。PL/SQL块没有返回类型。你能解释一下你到底想做什么以及为什么吗?如果您试图构建一个通用的“运行任何命令,返回结果”系统,有很多方法可以实现。不,我需要命令是PL/SQL块,而不是直接DDL指令,我刚刚添加了另一个示例您的第二个示例也不返回任何内容。就PL/SQL而言,发送到DBMS_输出的文本不是“返回值”。相反,它是您的客户机在PL/SQL完全执行完毕后可以读取和显示的内容。不过,我已经更新了我的答案,以显示如何从PL/SQL返回一个值,如果您确实有一个值的话。是的,我们认为这会起到作用,对于一个更复杂的问题,我们考虑插入到表中,在EXECUTE
语句之后,我们可以查找它