繁体   English   中英

我想在下面存储的 PROC 中参数化 TABLE_TO_BE_DELETED 表

[英]I want to parameterize TABLE_TO_BE_DELETED table in below stored PROC

但不是通过获取参数变量,我有一个表,其中包含所有表信息,我想一个接一个地获取表名完成删除获取另一个表名

开始
DECLARE SQLSTATE CHAR(5) DEFAULT '00000';
loop1: WHILE SQLSTATE = '00000' 做
从 ABC.TABLE_TO_BE_DELETED 删除其中 ID 在
(从 ABC.ID_DIM 中选择 ID)仅使用 UR 获取第一个 2000000 行;

IF SQLSTATE = '02000' THEN -- 未找到
离开循环1;
万一;
犯罪;
结束;
结尾@

我要做的是在 cursor 中获取表的结果,然后循环它们

类似的东西:

DECLARE Tables_cursor CURSOR FOR SELECT table_name FROM table_of_tables

OPEN Tables_cursor
FETCH NEXT FROM Tables_cursor INTO @table_name

DELETE FROM @table_name where ID in
(select ID from ABC.ID_DIM ) FETCH FIRST 2000000 ROWS ONLY WITh UR;

WHILE @@FETCH_STATUS = 0
BEGIN

    FETCH NEXT FROM Tables_cursor INTO @table_name
END 

我从未使用过,但我认为它会是这样的:

   EXEC SQL DECLARE C1 CURSOR FOR
     SELECT tablename  FROM table_of_tables

    EXEC SQL OPEN C1;
    DO WHILE (SQLCODE = 0);
     EXEC SQL FETCH C1 INTO :TABLE_NAME
     DELETE FROM TABLE_NAME as curentTable where ID in
     (select ID from ABC.ID_DIM ) FETCH FIRST 2000000 ROWS ONLY WITh UR;
    END;
    EXEC SQL CLOSE C1;

对于动态列表中多个表的大量删除行,如果我的目标正确的话。

BEGIN
  DECLARE SQLSTATE CHAR(5) DEFAULT '00000';

  FOR V AS C1 CURSOR WITH HOLD FOR 
   SELECT 'DELETE FROM (SELECT 1 FROM ' || TABNAME || ' T WHERE EXISTS (SELECT 1 FROM ABC.ID_DIM D WHERE D.ID = T.ID) FETCH FIRST 2000000 ROWS ONLY WITH UR)' AS STMT 
   FROM TABLE_WITH_COLUMN_TABNAME
  DO
    L1: LOOP
      EXECUTE IMMEDIATE V.STMT;
      IF SQLSTATE = '02000' THEN LEAVE L1; END IF;
      COMMIT;
    END LOOP;
  END FOR;
END@

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM