Oracle中WHENEVER SQLERROR的正确用法及示例咨询
Oracle WHENEVER SQLERROR 正确用法及示例
WHENEVER SQLERROR 是Oracle SQL*Plus的专属命令,用来定义执行SQL/PLSQL语句遇到错误时的处理逻辑——比如直接退出脚本、返回指定错误码、执行自定义命令等,能帮你在批量执行脚本时更灵活地处理异常。
核心用法选项
- EXIT [SUCCESS|FAILURE|n|variable|:BindVariable] [COMMIT|ROLLBACK]:遇到错误时退出SQL*Plus,可指定退出状态码,以及事务是提交还是回滚
- CONTINUE [COMMIT|ROLLBACK|NONE]:遇到错误时不中断,继续执行后续脚本,同样可指定事务处理方式
- DO command:遇到错误时执行指定的SQL*Plus命令
实际示例
示例1:错误时退出并回滚事务
WHENEVER SQLERROR EXIT FAILURE ROLLBACK -- 故意写错表名触发错误 SELECT * FROM non_existent_table; -- 这条语句不会执行,因为上面出错后直接退出 SELECT * FROM dual;
执行到错误语句时,SQL*Plus会自动回滚未提交的事务,然后以失败状态退出,后续代码完全不会运行。
示例2:错误时返回指定退出码并提交
WHENEVER SQLERROR EXIT 100 COMMIT INSERT INTO employees (emp_id, emp_name) VALUES (1, 'Alice'); -- 违反主键约束触发错误(假设emp_id是主键) INSERT INTO employees (emp_id, emp_name) VALUES (1, 'Bob'); COMMIT;
遇到主键冲突错误时,SQL*Plus会先提交之前成功插入的记录,然后以100作为退出码终止脚本。
示例3:错误时继续执行并回滚
WHENEVER SQLERROR CONTINUE ROLLBACK SELECT * FROM non_existent_table; -- 这条语句会正常执行,因为设置了CONTINUE SELECT '错误已处理,脚本继续运行' FROM dual;
第一个查询出错后,会回滚当前事务,但脚本不会中断,会继续执行后续的SQL语句。
示例4:错误时执行自定义命令
WHENEVER SQLERROR DO "PROMPT 执行出错了!; SET TERMOUT OFF" SELECT * FROM non_existent_table;
遇到错误时,会执行指定的SQL*Plus命令:先打印提示信息,然后关闭终端输出。
注意事项
- 该命令只对设置之后执行的SQL/PLSQL语句生效,设置前的错误不会触发处理逻辑
- 它是SQL*Plus命令,不是标准SQL或PLSQL语句,有没有分号结尾都可以
- PLSQL块执行时抛出的错误,同样会被SQL*Plus捕获并触发该命令的处理逻辑
内容的提问来源于stack exchange,提问作者user87422
相关产品推荐
相关产品推荐

