You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 07:01:24