Exception 无效参数类型的PLSQL异常处理程序

Exception 无效参数类型的PLSQL异常处理程序,exception,plsql,Exception,Plsql,所以我有两个PL/SQL文件:p401包含P403要调用的函数(update_item_cost) 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_i

所以我有两个PL/SQL文件:p401包含P403要调用的函数(update_item_cost)

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;
  /
 DECLARE
        item_ident number;
        cost number;
 BEGIN  
         update_item_cost (&item_ident, &cost);
 END;
 /
   ITEM_ID     MESSAGE
               You entered an invalid number
P403代码:

  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;
  /
 DECLARE
        item_ident number;
        cost number;
 BEGIN  
         update_item_cost (&item_ident, &cost);
 END;
 /
   ITEM_ID     MESSAGE
               You entered an invalid number
有两个表:pitem(包含所有项目以及项目的说明和成本)和pitem\u audit(包含错误消息)。 比方说,用户输入了一个字符串,而不是item_ident(即“1x”)的数字。因此,异常处理程序将捕获错误并通过在pitem_审计表中插入一行返回错误消息,如下所示:

  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;
  /
 DECLARE
        item_ident number;
        cost number;
 BEGIN  
         update_item_cost (&item_ident, &cost);
 END;
 /
   ITEM_ID     MESSAGE
               You entered an invalid number
我尝试了VALUE\u ERROR(也尝试了INVALID\u 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
所以问题是为什么值\错误或无效\编号不起作用,以及如何修复它?我希望它能像NO\u DATA\u FOUND异常一样工作,当它在数据库中找不到项目时,它会在pitem\u audit表中插入一行

    ITEM_ID     MESSAGE
                Invalid Item Identifier

非常感谢,如果这太长了,我很抱歉:)

问题是,在调用
过程更新\u项目\u成本之前,当提示用户输入值时,在P403中发生类型转换异常,因此PROC没有机会在异常处理程序中处理该异常

Proc
更新项目成本
需要两个数字输入
(项目ID整数,fNewcost编号)

有两种选择

  • 将异常处理移动到外部进程,例如
    P403
    ——这将非常有意义,因为您现在将提示和验证用户输入的关注点与更新本身分离开来
  • P401
    中的
    iItemId
    的类型更改为
    VARCHAR
    或其他字符类型(支持任何用户输入),并对其中的数字进行解析