【发布时间】:2021-08-09 13:59:19
【问题描述】:
我正在使用DB2 11.5。
我有一个可以运行一些复杂任务的存储过程。
在运行任务之前,它会首先从日志表中检查作业是否已经在运行,如果是,它会向SQLSTATE 75002 发出错误消息。
如果它尚未运行,它将插入状态为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 时,我该如何处理在复杂任务运行时中止存储过程的信号?
我希望它在发生ctrl-c 时将job_status 更新为ABORTED,这样作业就不会永远“运行”。
#编辑 1
用户在安装了 db2 客户端的本地机器上使用 windows .bat 文件运行存储过程。
@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
【问题讨论】:
-
您不能将操作系统信号发送到 Db2 存储过程(例如,您不能将 Control-C 发送到 Db2 存储过程)。如果客户端工作站上的调用应用程序被 Control-C 中断,则客户端应用程序可能会选择停止,但由该应用程序启动的任何已经运行的存储过程将继续运行(默认情况下)并且不知道客户端应用程序已终止。
标签: sql stored-procedures db2