2015-03-19 127 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或其他字符类型(它将支持任何用户输入),并将解析结果编号为数字。