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

Posted

技术标签:

【中文标题】无效参数类型的 PLSQL 异常处理程序【英文标题】:PLSQL exception handler for invalid argument type 【发布时间】:2015-03-19 04:27:42 【问题描述】:

所以我有 2 个 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;
  /

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

非常感谢,如果篇幅过长,我很抱歉 :)

【问题讨论】:

【参考方案1】:

问题是在P403中发生类型转换异常,当提示用户输入值时,在调用PROCEDURE update_item_cost之前,因此PROC没有机会在异常处理程序中处理异常。

Proc update_item_cost 需要两个数字输入 (iItemId INTEGER,fNewcost NUMBER)

有几个选项

将异常处理转移到P403 等外部过程中 - 这将是最有意义的,因为您现在将提示和验证用户输入的关注点与执行更新本身分开。 将P401 中的iItemId 类型更改为VARCHAR 或其他字符类型(支持任何用户输入),并在那里解析为Number。

【讨论】:

以上是关于无效参数类型的 PLSQL 异常处理程序的主要内容,如果未能解决你的问题,请参考以下文章

10.异常处理自定义异常断言

将值从 Oracle 对象类型参数传递到 PLSQL 表类型参数

在 plsql 异常处理中返回命令无效吗?

Spring Cloud微服务统一处理异常

toJson 无法正常工作 json 序列化程序未处理的异常:无效参数:“DietMo​​del”的实例

SQL记录-PLSQL异常