db2 IBM plsql -游标

68bkxrlz  于 2022-11-07  发布在  DB2
关注(0)|答案(1)|浏览(196)

我是PLSQL(IDM db2)的新手,我正在尝试创建一个过程来查找和删除一些admin_tasks(如果存在)。
说明:通过运行下面的query 1,我可以找到调度程序中的任务列表:

SELECT * FROM SYSTOOLS.ADMIN_TASK_LIST;

要删除任务,我可以运行以下query 2:

call sysproc.admin_task_remove('TASK_NAME', null);

因此,我想创建一个过程来删除所有模式为“My_Task_"的任务。这应该会删除所有模式为”My_Task_“的任务,而保留其他现有任务不变。该过程应该处理admin_tasks不存在或没有创建admin_tasks的情况,并且应该在运行时不会引发任何错误。
我研究了一下,发现这可以通过使用游标来实现。
你能帮我实现这一点吗?
编辑:我设法找到了这个解决方案:

BEGIN
  FOR v1 AS c1 CURSOR FOR
    SELECT NAME 
    FROM SYSTOOLS.ADMIN_TASK_LIST
    WHERE NAME LIKE 'My\_task\_%' ESCAPE '\'
   DO
    call sysproc.admin_task_remove(NAME, null);
  END FOR;
END

除非尚未定义SYSTOOLS.ADMIN_TASK_LIST,否则这似乎是有效的。
如果未定义,则在运行查询时会出现以下错误:如果未定义,则会出现以下错误:[代码:-204,SQL状态:小行星42704
“SYSTOOLS.ADMIN_TASK_LIST”是一个未定义的名称。
那么我该如何绕过这个错误呢?首先检查SYSTOOLS.ADMIN_TASK_LIST是否被定义,如果它被定义到上面的查询中,如果没有,什么都不做。

yc0p9oo0

yc0p9oo01#

假设您的客户端工具使用“@”作为语句分隔符。

BEGIN
  FOR L1 AS 
    SELECT NAME 
    FROM SYSTOOLS.ADMIN_TASK_LIST
    WHERE NAME LIKE 'My\_task\_%' ESCAPE '\'
  DO
    CALL ADMIN_TASK_REMOVE (L1.NAME, NULL);
  END FOR;
END

更新日期:

对不存在的表进行错误处理。错误处理程序只是“吃掉”使用不存在的表时的错误。您必须使用动态SQL来完成此操作。

BEGIN
  DECLARE SQLSTATE CHAR (5);
  DECLARE L_NAME VARCHAR (128);
  DECLARE C1 CURSOR FOR S1; 
  DECLARE EXIT HANDLER FOR SQLSTATE '42704' BEGIN END;
  PREPARE S1 FROM 
    '
    SELECT NAME 
    FROM SYSTOOLS.ADMIN_TASK_LIST
    WHERE NAME LIKE ''My\_task\_%'' ESCAPE ''\''
    ';
  OPEN C1;
  L1:
  LOOP
    FETCH C1 INTO L_NAME;
    IF SQLSTATE = '02000' THEN LEAVE L1; END IF;
    CALL ADMIN_TASK_REMOVE (L_NAME, NULL);
  END LOOP L1;
  CLOSE C1;
END

相关问题