[英]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;
首先,您的程序存在一些錯誤:
您沒有正確使用分隔符。 應使用定界符終止整個過程,而不是每一行。
NetBeans SQL窗口不太了解SQL,因此無法確定過程何時結束以及其他什么開始。 通常,它使用分號( ;
)來告知一條語句何時結束而另一條語句何時開始,但是存儲過程可以在其中包含分號,從而無法使用。 相反,我們將分隔符更改為其他內容,以便NetBeans SQL窗口一次性將整個存儲過程發送到數據庫。
變量名稱不允許以下划線( _
)開頭。 特別是, 此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.