在Oracle中执行存储过程

时间:2011-05-27 15:27:57

标签: sql oracle ora-00904

我有一个存储过程,在Toad for Oracle上我正在调用该过程 使用

SELECT FROM PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7) 
  FROM DUAL

我在这个程序上有3个输出参数,我得到了一个

  

ORA-00904:PKGName.ProcedureName:无效的标识符

还必须提及过程调用的输出参数吗?如果是,我该如何使用它?

6 个答案:

答案 0 :(得分:4)

您不能在SELECT语句中使用过程。函数是(具有适当的返回类型),程序号。 SELECT列表中的项必须是expressions,必须解析为值。程序不符合此标准。

是的,您需要在参数列表中提及输出变量。该过程将这些参数设置为某些值,需要为每个参数指定一个输出参数来接收它们。 @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> 

答案 1 :(得分:2)

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;
/

答案 2 :(得分:1)

如果您希望能够从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(标题几乎是一篇文章hehehe)。

答案 3 :(得分:0)

是的,您必须提供所有参数。声明一个适当类型的变量,并将其作为输出参数传递。

答案 4 :(得分:0)

您不应该使用SELECT语句调用过程(即使您这样做,调用也将在FROM部分之前)。

相反,使用SQL * Plus提示符(我认为Toad有一个内置的SQL * Plus接口):

exec PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7);

答案 5 :(得分:-1)

问题中的代码在语法上是错误的,它应该是

SELECT PKGName.ProcedureName(1,'10/10/2010','10/23/2010',7,7) FROM DUAL

但是,这只适用于功能。但是因为它显然在Toad工作,我认为海报确实有功能。我还假设使用SQL是先决条件。

如果问题的关键是如何使用多个输出参数 - 尝试创建用户定义的类型。也许这个问题应该重命名为“在Oracle中调用带有SQL输出参数的过程”。

否则,没有输出参数的简单包装函数就可以完成这项工作。