因此,我有2個PL/SQL文件:p401包含要由P403調用的函數(update_item_cost)。用於無效參數類型的PLSQL異常處理程序
P401代碼:
CREATE or replace PROCEDURE update_item_cost (iItemId INTEGER, fNewcost NUMBER) AS
fCurCost NUMBER (10,2);
BEGIN
SELECT item_cost INTO fCurCost FROM pitem
WHERE item_id = iItemId;
UPDATE pitem SET item_cost = fNewCost
WHERE item_id = iItemId;
COMMIT;
EXCEPTION
WHEN NO_DATA_FOUND THEN
INSERT INTO pitem_audit VALUES (iItemId, 'Invalid Item Identifier');
COMMIT;
WHEN VALUE_ERROR THEN
INSERT INTO pitem_audit VALUES (iItemId, 'You entered an invalid number');
COMMIT;
WHEN OTHERS THEN
ROLLBACK;
INSERT INTO pitem_audit VALUES (iItemId, 'Miscellaneous error.');
COMMIT;
END update_item_cost;
/
P403代碼:
DECLARE
item_ident number;
cost number;
BEGIN
update_item_cost (&item_ident, &cost);
END;
/
有兩個表:pitem(有所有的項目和說明和項目的成本),以及pitem_audit(包含錯誤消息)。 比方說,例如,用戶輸入了一個字符串,而不是item_ident的數字(即'1x')。所以異常處理程序將捕獲錯誤並通過插入行成pitem_audit表如下返回的錯誤信息:
ITEM_ID MESSAGE
You entered an invalid number
我試圖VALUE_ERROR(也INVALID_NUMBER)作爲例外處理程序,但沒有他們工作。當我執行P403和功能(update_item_cost)被調用,我得到這個錯誤:
SQL> DECLARE
item_ident number;
cost number;
BEGIN
update_item_cost (&item_ident, &cost);
END;
/
Enter value for item_ident: '1x'
Enter value for cost: 250
old 5: update_item_cost (&item_ident, &cost);
new 5: update_item_cost ('1x', 250);
DECLARE
*
ERROR at line 1:
ORA-06502: PL/SQL: numeric or value error: character to number conversion error
ORA-06512: at line 5
所以,問題是爲何VALUE_ERROR或INVALID_NUMBER不工作,我該如何解決?我希望它能像NO_DATA_FOUND異常一樣工作,它在數據庫中找不到項目時將一行插入到pitem_audit表中。
ITEM_ID MESSAGE
Invalid Item Identifier
非常感謝,我很抱歉,如果這是過於冗長:)