【发布时间】: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
非常感谢,如果篇幅过长,我很抱歉 :)
【问题讨论】: