Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 不从db2中删除记录的存储过程_Sql_Stored Procedures_Db2 - Fatal编程技术网

Sql 不从db2中删除记录的存储过程

Sql 不从db2中删除记录的存储过程,sql,stored-procedures,db2,Sql,Stored Procedures,Db2,我在db2表中有19条记录来满足分配给cursor的条件,我在执行该命令后获得success命令,但没有从db中删除任何值。请帮助我,我在哪里遗漏了什么。似乎您正试图从光标读取的同一个表中删除。根据您运行的隔离级别,可能会出现锁定错误 在示例代码中,似乎没有任何理由首先使用游标。你应该删除这个集合 CREATE OR REPLACE PROCEDURE WRK.PURGE_ACH_BATCH_TAB_1() LANGUAGE SQL BEGIN -- Declare cursor

我在db2表中有19条记录来满足分配给cursor的条件,我在执行该命令后获得success命令,但没有从db中删除任何值。请帮助我,我在哪里遗漏了什么。

似乎您正试图从光标读取的同一个表中删除。根据您运行的隔离级别,可能会出现锁定错误

在示例代码中,似乎没有任何理由首先使用游标。你应该删除这个集合

CREATE OR REPLACE PROCEDURE  WRK.PURGE_ACH_BATCH_TAB_1()
LANGUAGE SQL

BEGIN
    -- Declare cursor
    DECLARE v_CNT_BLOCK INTEGER;
    DECLARE Ac_no BIGINT;
    DECLARE SQLSTATE CHAR(5) DEFAULT '00000'; 
    DECLARE mycur cursor for 
        SELECT t.TNX_Ac_no
        FROM WRK.BATCH_TAB1 c
            INNER JOIN WRK.BATCH_TAB t
                ON c.BATCH_ID = t.BATCH_ID
                    AND c.PROCESS_ID = t.process_ID
        WHERE c.BATCH_START_TS < (CURRENT DATE -7 days); 

    set v_CNT_BLOCK = 0;
    open mycur;

    FETCH FROM mycur INTO Ac_no;
    WHILE(SQLSTATE = '00000') DO
        DELETE FROM WRK.BATCH_TAB1 b WHERE b.TNX_Ac_no = Ac_no;
        SET v_CNT_BLOCK=v_CNT_BLOCK+1;
        if v_CNT_BLOCK >= 5 then
            set v_CNT_BLOCK = 0;
            commit;
        end if;

        FETCH FROM mycur INTO Ac_no;  

    END WHILE; 

    CLOSE mycur; 

    commit; 

END
@ 

删除光标刚刚返回的记录。当然,如果使用内部联接,则无法使用原始游标。但是,如果您使用上面我的答案中的WHERE-EXISTS语法,则定位删除将是一个选项。

对于足够新的DB2版本,您应该能够执行以下操作:

DELETE FROM WRK.BATCH_TAB1 WHERE CURRENT OF CURSOR mycur;

为什么这个标签是甲骨文?这似乎与Oracle无关。请注意,在声明游标时没有with HOLD子句,它将在第一次提交后关闭。您好,charles。。我为什么要带着光标去。。我的桌子有很多交易。。所以我想删除一些记录,并且必须立即提交。。。我想继续下一阶段的记录。你的意思是。。我们无法将内部联接与游标一起使用。从WRK.BATCH\u选项卡中删除c如果存在,请从WRK.BATCH\u选项卡中选择1,其中c.BATCH\u ID=t.BATCH\u ID和c.PROCESS\u ID=t.PROCESS\u ID和t.BATCH\u START\u TS<当前日期-7天。。“批次开始”实际上来自“批次”选项卡表。。。当我使用我们的delete时,它没有作用域,应该只能够将它移动到EXISTS子句中。编辑我的答案以显示这一点。至于内部连接,不,我的意思是你不能使用一个带有定位delete.charles的连接的游标,你能帮助处理这个查询吗?从SELECT*FROM WRK.BAH_t c在存在的地方从WRK.BAH_c t中选择1,其中c.BAH_ID=t.BAH_ID和c.PID=t.PID和VARCHAR_格式c.BAH_START_TS,YYYY-MM-DDDELETE FROM WRK.BATCH_TAB1 c WHERE EXISTS (SELECT 1 FROM WRK.BATCH_TAB t WHERE c.BATCH_ID = t.BATCH_ID AND c.PROCESS_ID = t.process_ID AND t.BATCH_START_TS < (CURRENT DATE -7 days) );
DELETE FROM WRK.BATCH_TAB1 WHERE CURRENT OF CURSOR mycur;
BEGIN
 DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
 loop1: WHILE SQLSTATE = '00000' DO
  DELETE FROM (
   SELECT FROM WRK.BATCH_TAB1 c
   WHERE EXISTS (SELECT 1 FROM WRK.BATCH_TAB t
               WHERE c.BATCH_ID = t.BATCH_ID
                 AND c.PROCESS_ID = t.process_ID
                 AND t.BATCH_START_TS < (CURRENT DATE -7 days)
   ) FETCH FIRST 5 ROWS ONLY
  );
  IF SQLSTATE = '02000' THEN -- not found
   LEAVE loop1;
  END IF;
  COMMIT;
 END WHILE;
END@