2015-03-19 124 views
1

因此,我有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 

非常感謝,我很抱歉,如果這是過於冗長:)

回答

0

的問題是,在P403中,當用戶被提示輸入值發生類型轉換異常,前PROCEDURE update_item_cost是稱爲,因此PROC沒有機會處理異常處理程序中的異常。

Proc update_item_cost需要兩個數字輸入(iItemId INTEGER,fNewcost NUMBER)

有幾個選項

  • 動,異常處理外PROC如P403 - 這將使最有意義的是你現在分離提示和驗證用戶輸入,從做的擔憂更新本身。
  • iItemId的類型更改爲VARCHARVARCHAR或其他字符類型(它將支持任何用戶輸入),並將解析結果編號爲數字。