因此,我有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
非常感谢,我很抱歉,如果这是过于冗长:)