Oracle Package或function ...处于无效状态

时间:2015-09-13 12:11:51

标签: java oracle jdbc

我坚持使用Oracle商店程序调用。代码看起来很简单,但我真的不知道如何使它工作。 这是我创建过程的代码

DELIMITER @@
CREATE OR REPLACE PROCEDURE updateAward(_total_amount in Number, _no_of_sales in Number, _agent in NUMBER, _id in NUMBER) AS
    BEGIN
      update Award set total_amount = _total_amount, no_of_sales = _no_of_sales, agent_id = _agent where ID = _id @@
      commit @@

所以,当我通过NetBean执行它时(它是我目前唯一的工具),代码运行良好。 我还尝试运行编译语句

alter PROCEDURE updateAward compile;

然后,使用

select *
  from user_errors
 where name = 'ORG_SPGETTYPE'

select返回空,证明编译过程正常。但是,当我触发程序时

call updateAward(1,1,1,1);

它返回错误

Package or function UPDATEAWARD is in an invalid state

和命令

SELECT object_name FROM user_objects WHERE status='INVALID';

返回程序的名称。我该如何解决这个问题?

更新1:

如果我使用

BEGIN
updateAward(1,1,1,1);
End;

我收到了错误

    Error code 6550, SQL state 65000: ORA-06550: line 2, column 20:
PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:

   := . ( % ;

更新2:

我放置分隔符的原因是因为我收到错误&#34 ;;"通过一些VPN工作到另一个网络(仍然不知道为什么)。所以,我更新了代码,就像您的答案一样,然后,在程序结束时使用End;,然后获取Invalid SQL statement1。如果我删除它并执行(通过Netbean),则成功创建过程。但是,在编译并检查user_errors之后,它得到了

"PLS-00103: Encountered the symbol "end-of-file" when expecting one of the following:     ; "

1 个答案:

答案 0 :(得分:2)

<击> 首先,您的过程语法看起来不对。不要使用DELIMITER,因为该语法特定于MySQL。相反,尝试以下内容。

CREATE OR REPLACE PROCEDURE updateAward(_total_amount in Number, _no_of_sales in Number, _agent in NUMBER, _id in NUMBER) AS
    BEGIN
      update Award set total_amount = _total_amount, no_of_sales = _no_of_sales, agent_id = _agent where ID = _id;
      commit;
    END;

<击>

首先,您的程序存在一些问题:

  1. 您没有正确使用分隔符。应使用分隔符来终止整个过程,而不是每一行。

    NetBeans SQL窗口不能很好地了解SQL,因此无法判断过程何时结束以及其他事情何时开始。通常,它使用分号(;)来判断一个语句何时结束而另一个语句何时开始,但存储过程可以在其中包含分号,这样就不起作用。相反,我们将分隔符更改为其他内容,以便NetBeans SQL窗口一次性将整个存储过程发送到数据库。

  2. 不允许变量名以下划线(_)开头。特别是,this Oracle documentation page的模式对象命名规则列表中的规则5表明

      

    不带引号的标识符必须以数据库字符集中的字母字符开头。

    下划线不是字母字符。

  3. 我已经采取了你的程序,修复了分隔符的使用,并在每个参数名称的前面添加了一个额外的pp为'参数'),我得到了以下内容,在NetBeans中成功运行并创建了一个没有错误的过程:

    delimiter $$
    CREATE OR REPLACE PROCEDURE updateAward(p_total_amount in Number, p_no_of_sales in Number, p_agent in NUMBER, p_id in NUMBER) AS
        BEGIN
          update Award set total_amount = p_total_amount, no_of_sales = p_no_of_sales, agent_id = p_agent where ID = p_id;
          commit;
        END;
    $$
    delimiter ;
    

    其次,你写了

      

    [...]然后,使用

    select *
      from user_errors
      where name = 'ORG_SPGETTYPE'
    
         

    select返回为空,证明编译过程正常。

    嗯,不。这证明过程ORG_SPGETTYPE中没有错误(或者不存在具有该名称的过程)。您的过程名为updateAward,Oracle会将其大写为UPDATEAWARD。尝试

    select *
      from user_errors
     where name = 'UPDATEAWARD';
    

    代替。