DM8数据库DIsql工具:WHENEVER命令详解
🌺The Begin🌺点点关注,收藏不迷路🌺
|
一、WHENEVER命令概述
在达梦数据库的DIsql工具中,WHENEVER命令是管理SQL错误处理的强大工具。它允许开发者预先定义当SQL语句执行出错时的处理策略,极大地提高了脚本的健壮性和自动化程度。
二、基本语法结构
WHENEVER命令的基本语法如下:
WHENEVER SQLERROR
CONTINUE [ COMMIT | ROLLBACK | NONE ] |
EXIT [ SUCCESS | FAILURE | WARNING | n | <variable> | : <bindvariable> ] [ COMMIT | ROLLBACK ]
三、参数详解
1. 处理方式选项
-
CONTINUE:遇到错误继续执行
COMMIT
:继续前提交当前事务ROLLBACK
:继续前回滚当前事务NONE
:不处理事务直接继续(默认)
-
EXIT:遇到错误退出DIsql
- 退出状态码可选:
SUCCESS
:以成功状态退出(0)FAILURE
:以失败状态退出(1)WARNING
:以警告状态退出(2)- 具体数字或变量
- 退出状态码可选:
2. 事务控制选项
COMMIT
:退出前提交事务ROLLBACK
:退出前回滚事务
四、实际应用示例
示例1:简单错误继续
WHENEVER SQLERROR CONTINUE;
SELECT * FROM MYDMDB.department; ---不存在的表;
SELECT * FROM MYDMDB.departments; -- 这行仍会执行
示例2:错误时回滚并退出
-- 设置错误处理方式:遇到SQL错误时回滚事务并退出
WHENEVER SQLERROR EXIT ROLLBACK;
-- 创建测试表(如果不存在)
CREATE TABLE IF NOT EXISTS account (
id INT PRIMARY KEY,
name VARCHAR(50),
balance DECIMAL(10,2)
);
CREATE TABLE IF NOT EXISTS transaction_log (
id INT PRIMARY KEY,
account_id INT,
amount DECIMAL(10,2),
trans_date DATETIME
);
-- 清空测试数据(仅用于演示)
TRUNCATE TABLE account;
TRUNCATE TABLE transaction_log;
-- 初始化账户数据
INSERT INTO account VALUES(1, '张三', 1000.00);
INSERT INTO account VALUES(2, '李四', 500.00);
-- 开始事务(在达梦中默认自动提交是关闭的)
BEGIN;
-- 模拟转账业务:张三向李四转账200元
-- 1. 从张三账户扣款
UPDATE account SET balance = balance - 200 WHERE id = 1;
-- 2. 记录交易日志(故意使用无效数据导致错误)
INSERT INTO transaction_log VALUES(1, 1, -200, SYSDATE);
INSERT INTO transaction_log VALUES(2, 2, 200, '无效日期格式'); -- 这里会出错
-- 3. 向李四账户加款(这行不会执行,因为上面已经出错)
UPDATE account SET balance = balance + 200 WHERE id = 2;
-- 提交事务(只有所有操作成功才会执行到这里)
COMMIT;
-- 查询结果(正常情况下不会执行到这里)
SELECT * FROM account;
SELECT * FROM transaction_log;
示例3:自定义退出码
WHENEVER SQLERROR EXIT 100;
SELECT * FROM MYDMDB.department; ---不存在的表;
-- 退出后可通过echo $?(Linux)或echo %ERRORLEVEL%(Windows)查看返回码
五、总结
WHENEVER命令是达梦数据库DIsql工具中异常处理的利器,特别适合:
- 自动化部署脚本
- 批处理作业
- 无人值守任务
- CI/CD流程中的数据库操作
合理使用WHENEVER命令可以显著提高数据库脚本的可靠性和可维护性,是每位达梦数据库开发者应该掌握的技能。
🌺The End🌺点点关注,收藏不迷路🌺
|