簡體   English   中英

Oracle軟件包或函數…處於無效狀態

[英]Oracle Package or function … is in an invalid state

我堅持使用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(這是我目前擁有的唯一工具)執行代碼時,代碼運行良好。 我也嘗試運行compile語句

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:

我放置分隔符的原因是因為“;”出現錯誤 通過某些VPN連接到另一個網絡時(仍然不確定原因)。 因此,我更新了代碼,就像您的答案一樣,但是后來有了End; 在該過程的最后,然后獲取Invalid SQL statement1 如果我刪除它並執行(通過Netbean),則過程創建成功。 但是,編譯並檢查user_errors ,它得到了

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

首先,您的過程語法看起來錯誤。 不要使用 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. 變量名稱不允許以下划線( _ )開頭。 特別是, 此Oracle文檔頁面上的 “架構對象命名規則”列表中的規則5指出:

    未引用的標識符必須以數據庫字符集中的字母字符開頭。

    下划線不是字母字符。

我已經完成了您的過程,固定了定界符的使用,並在每個參數名稱的前面添加了一個額外的p (“ p代表“ parameter”),然后得到了以下內容,它們在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';

代替。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM