【问题标题】:Executing a Stored Procedure in Oracle在 Oracle 中执行存储过程
【发布时间】:2011-05-27 15:27:57
【问题描述】:

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

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

我在这个过程中也有 3 个输出参数,我得到了一个

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

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

【问题讨论】:

  • 我觉得这个问题也适合oracleoverflow.com
  • 您不能从 sql 语句中调用带有输出参数的函数。正如 DCookie 所指出的,您不能调用过程。只能调用函数。

标签: sql oracle ora-00904


【解决方案1】:

您不能在 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> 

【讨论】:

    【解决方案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;
    /
    

    【讨论】:

      【解决方案3】:

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

      【讨论】:

      • 不错的发现!我知道可以从 SQL 调用过程。很明显,它需要 Java 开发人员的犯罪能量来解决他们 DBA 的限制来解决这个问题:)
      【解决方案4】:

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

      【讨论】:

        【解决方案5】:

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

        改为使用 SQL*Plus 提示符(我认为 Toad 具有内置的 SQL*Plus 界面):

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

        【讨论】:

          【解决方案6】:

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

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

          但是,这仅适用于函数。但由于它显然在 Toad 中工作,我认为海报确实有一个功能。我还假设使用 SQL 是先决条件。

          如果问题的重点是如何使用多个输出参数 - 尝试创建用户定义类型。也许这个问题应该被重命名为“Calling a procedure with output parameters from SQL in Oracle”。

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-06-19
            • 2014-12-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2022-07-21
            • 2011-11-07
            • 1970-01-01
            相关资源
            最近更新 更多