首页 > 解决方案 > 如何在 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 更新为何ABORTEDctrl-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

标签: sqlstored-proceduresdb2

解决方案


在 SP 中没有办法做到这一点。
在强制调用者离开数据库、取消活动和一些其他条件(例如,日志已满)时,控制不会传递给 SP 中定义的异常处理程序。

因此,不要将任何标志/状态管理逻辑放入 SP 异常处理程序中。


推荐阅读