我有一个存储过程,在Toad for Oracle中,我正在使用以下方式调用该过程:
SELECT FROM PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7)
FROM DUAL
我有一个存储过程有3个输出参数,但是我得到了一个
ORA-00904:PKGName.ProcedureName:无效标识符
我是否也需要在存储过程调用中提到输出参数?如果是,我该如何使用它?
我有一个存储过程,在Toad for Oracle中,我正在使用以下方式调用该过程:
SELECT FROM PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7)
FROM DUAL
我有一个存储过程有3个输出参数,但是我得到了一个
ORA-00904:PKGName.ProcedureName:无效标识符
我是否也需要在存储过程调用中提到输出参数?如果是,我该如何使用它?
您不能在SELECT语句中使用过程。函数可以(具有适当的返回类型),但过程不行。SELECT列表中的项必须是表达式,这些表达式必须解析为一个值。过程不符合此标准。
是的,您确实需要在参数列表中提及输出变量。该过程将设置这些参数的某些值,因此需要为每个参数指定一个输出参数来接收它们。@schurik向您展示了在PL/SQL中通常的操作方式。@Datajam接近于在SQL*Plus中执行操作,但遗漏了输出参数:
SQL> var num_var number
SQL> var txt_var varchar2(15)
SQL> var txt_var2 varchar2(20)
SQL> exec PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7, :num_var, :txt_var, :txt_var2);
PL/SQL procedure successfully completed
num_var
---------------
42
txt_var
-----------------
some text
txt_var2
-------------------
some other text
SQL>
declare
-- declare variables to keep output values
output_par_1 varchar2(100);
output_par_2 number(10);
...
begin
PKGName.ProcedureName(1,'10/10/2010','10/23/2010',output_par_1,output_par_2);
-- display output values
dbms_output.put_line('output_par_1: ' || output_par_1);
dbms_output.put_line('output_par_2: ' || output_par_2);
end;
/
如果您想从select中调用存储过程,请使用函数或表函数进行包装。有关更多详细信息,请参见此处:http://technology.amis.nl/blog/1017/calling-stored-procedures-using-plain-sql-for-when-sql-is-allowed-but-calls-to-stored-procedures-are-not(标题几乎是一篇文章,呵呵呵)。
你不应该使用SELECT语句来调用一个过程(即使你这样做了,调用也应该在FROM部分之前)。
相反,可以使用SQL*Plus提示符(我认为Toad有内置的SQL*Plus接口):
exec PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7);
是的,您必须提供所有参数。声明一个适当类型的变量并将其作为输出参数传递。
问题中的代码在语法上是错误的,应该是这样的:
SELECT PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7) FROM DUAL
然而,这只适用于函数。但由于在Toad中显然可以工作,我假设发帖者实际上确实有一个函数。我还假设使用SQL是先决条件。
如果问题的重点是如何利用多个输出参数-尝试创建用户定义类型。也许问题应该改名为“从Oracle中的SQL调用具有输出参数的过程”。
否则,没有输出参数的简单包装器函数就可以完成工作。