我有调用过程 #2 的过程 #1。当过程 #2 引发错误时,它会成功显示有关错误的消息。但是,过程 #1 仍然显示客户已成功添加到数据库中的消息。我怎样才能阻止这种情况发生?
CREATE OR REPLACE PROCEDURE ADD_CUST_TO_DB (pcustid number, pcustname varchar2) AS
err_range EXCEPTION;
BEGIN
if pcustid < 1 OR pcustid > 499 THEN
RAISE err_range;
ELSE
INSERT INTO CUSTOMER (CUSTID, CUSTNAME, SALES_YTD, STATUS) VALUES (pcustid, pcustname, 0, 'OK');
END IF;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line('ORA-20001:ERROR:DUPLICATE CUSTOMER ID');
WHEN err_range THEN
dbms_output.put_line('ORA-20002:ERROR:CUSTOMER ID OUT OF RANGE');
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
dbms_output.put_line(SQLCODE);
END;
CREATE OR REPLACE PROCEDURE ADD_CUSTOMER_VIASQLDEV (pcustid number, pcustname varchar2) IS
BEGIN
dbms_output.put_line('----------------------');
dbms_output.put_line('Adding customer. ' || 'ID: ' || pcustid || ' Name: ' || pcustname);
ADD_CUST_TO_DB(pcustid, pcustname);
dbms_output.put_line('Customer Added OK');
commit;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
END;
Actual result: Adding customer. ID: 595 Name: Jeff Jeff ORA-20002:ERROR:CUSTOMER ID OUT OF RANGE Customer Added OK
Expected result: Adding customer. ID: 595 Name: Jeff Jeff ORA-20002:ERROR:CUSTOMER ID OUT OF RANGE
最佳答案
您在 ADD_CUST_TO_DB
中的异常得到了正确处理,过程 ADD_CUSTOMER_VIASQLDEV
甚至不知道它。
您应该从 ADD_CUST_TO_DB
过程的 EXCEPTION
block 中引发错误,该过程将由 ADD_CUSTOMER_VIASQLDEV
处理,或者您甚至可以设置一个OUT 参数以了解 ADD_CUSTOMER_VIASQLDEV
中的确切错误。
类似下面的内容将为您完成任务。 (从 ADD_CUST_TO_DB
中抛出异常)
CREATE OR REPLACE PROCEDURE ADD_CUST_TO_DB (pcustid number, pcustname varchar2) AS
err_range EXCEPTION;
BEGIN
if pcustid < 1 OR pcustid > 499 THEN
RAISE err_range;
ELSE
INSERT INTO CUSTOMER (CUSTID, CUSTNAME, SALES_YTD, STATUS) VALUES (pcustid, pcustname, 0, 'OK');
END IF;
EXCEPTION
WHEN DUP_VAL_ON_INDEX THEN
dbms_output.put_line('ORA-20001:ERROR:DUPLICATE CUSTOMER ID');
RAISE; --add this
WHEN err_range THEN
dbms_output.put_line('ORA-20002:ERROR:CUSTOMER ID OUT OF RANGE');
RAISE; --add this
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
dbms_output.put_line(SQLCODE);
RAISE; --add this
END;
/
干杯!
关于database - 当过程 #2 失败并引发错误时,如何阻止过程 #1 显示成功消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57906337/