我有一个存储过程,在 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- procedure-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 的输出参数调用过程”。
否则,没有输出参数的简单包装函数就可以完成这项工作。