Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
执行即时PL/SQL块返回类型_Sql_Oracle_Plsql - Fatal编程技术网

执行即时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
语句之后,我们可以查找它