database - 当过程 #2 失败并引发错误时,如何阻止过程 #1 显示成功消息?

标签 database oracle stored-procedures plsql

我有调用过程 #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/

相关文章:

iphone - 在 iPhone iOS 5 应用程序中使用 SQLite 数据库?

database - 一个数据库中出现“SQL 命令未正确结束”错误,但另一个数据库却没有,使用相同的脚本创建序列

mysql - MySQL 程序中的参数类型?

mysql - 使用选择查询问题

sql - 通过执行变量中的语句从存储过程中获取SQLCODE和SQLSTATE

oracle - 即使具有相关权限,Oracle 数据库用户也无法创建数据库作业

python - 使用 python 构建自动更新的在线安全数据库?

mysql - 数据库设计 - 表关系 - 更喜欢最小关系或 "time saving"关系

mysql - 如何删除列中位于两个确切单词之间的单词

Oracle PL/SQL : How to implement pointers to in-memory record types