sql - 如何在 DB2 存储过程中捕获 ctrl-c 行为
问题描述
我正在使用DB2 11.5
.
我有一个将运行一些复杂任务的存储过程。在运行任务之前,它将首先从日志表中检查作业是否已经在运行,如果是,它会发出SQLSTATE 75002
错误消息。
如果它尚未运行,它将插入一条带有 status 的作业记录RUNNING
,然后运行任务。
完成后,它将状态更新为FINISHED
.
CREATE OR REPLACE PROCEDURE WORK.TEST_SP()
P1: BEGIN
if exists(select 1 from db2inst1.job_log where job='abc' and status='RUNNING' and date=current date) then
SIGNAL SQLSTATE '75002' SET MESSAGE_TEXT = 'Job abc is already running, please wait for it to finish';
end if;
insert into db2inst1.job_log values ('abc', 'RUNNING', current date);
commit;
-- Some complex tasks here
call dbms_lock.sleep(120);
update db2inst1.job_log set job_status='FINISHED' where job_name='abc' and job_date=current date
commit;
END P1
ctrl-c
我的问题是,当复杂任务正在运行时,当用户按下中止存储过程时,我该如何处理 sigint ?
我希望它将 job_status 更新为何ABORTED
时ctrl-c
发生,以便该作业不会永远“运行”。
#编辑 1
.bat
用户在安装了 db2 客户端的本地机器上使用windows 文件运行存储过程。
@echo off
@if ""%DB2CLP%""=="""" db2cmd /c /i /w ""%0"" && goto :EOF
db2 connect to mydb user db2inst1 using abc123
db2 "call WORK.TEST_SP()"
IF ERRORLEVEL 1 (echo Job failed) else (echo Job done)
db2 connect reset > nul
pause
解决方案
在 SP 中没有办法做到这一点。
在强制调用者离开数据库、取消活动和一些其他条件(例如,日志已满)时,控制不会传递给 SP 中定义的异常处理程序。
因此,不要将任何标志/状态管理逻辑放入 SP 异常处理程序中。
推荐阅读
- mysql - 为什么 MySQL 不能使用部分主键索引?
- python - SQLAlchemy“有序”
- mysql - 从 5.7 升级到 mysql 8 的查询语法问题
- asynchronous - Flutter:期货和共享偏好
- php - 获取行数限制值sql php
- ios - FsCalendar 实现 iOS 中的问题
- c# - 没有等待的异步方法与 Task.FromResult
- webpack - 使用 NextJS 时如何将多个 JS 文件合并到一个包中?
- powerbi - 打开 Power BI Desktop 时在 cmd 中传递参数
- microsoft-graph-api - MS Graph:orderby=lastModifiedDateTime 失败