Exception 无效参数类型的PLSQL异常处理程序
所以我有两个PL/SQL文件:p401包含P403要调用的函数(update_item_cost) P401代码: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
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
或其他字符类型(支持任何用户输入),并对其中的数字进行解析