循环语句中表名的动态变量

Posted

技术标签:

【中文标题】循环语句中表名的动态变量【英文标题】:Dynamic variable for table name inside a loop statement 【发布时间】:2018-06-28 13:02:35 【问题描述】:

我试图在另一个 for-loop 语句中使用 for-loop 语句,其中内部 for-loop 查询中使用的 table_name 是第一个 for-loop 的结果:

declare
l_insert_count pls_integer := 0;
begin

for row_outer in (select distinct table_name, item_type from TRANSFORMATION_MAPPING) LOOP
  l_insert_count := 0;


  for row in (select id from ***row_outer.table_name*** where NVL(platnost_do,sysdate)>=sysdate) LOOP

    execute immediate 'insert into ITEM_MAPPING(GUID,ID) VALUES(''CENDB:''' || sys_guid() || ',' || row.id || ')';

    l_insert_count  := l_insert_count + 1;  

    IF (l_insert_count > 999) THEN
        l_insert_count := 0;
        commit;
    END IF;

  END LOOP;

end LOOP;

commit;

end;
/

内循环的主体要复杂得多。提供的代码仅用于显示我想要做什么。 row_outer.table_name 是我希望循环执行我需要的转换的表的变量名。在内部循环中,我需要根据外部循环中的表将几百万行插入几个不同的表中。

非常感谢:)

【问题讨论】:

【参考方案1】:

我做了这样的事情(未经测试):

declare
    l_insert_count pls_integer := 0;
    l_detail_cur sys_refcursor;
    l_detail_id integer;
begin
    for r in (
        select distinct table_name, item_type
        from   transformation_mapping
    )
    loop
        l_insert_count := 0;
        l_detail_id := null;

        open l_detail_cur for 'select id from '||r.table_name||' where nvl(platnost_do, sysdate) >= sysdate';

        loop
            fetch l_detail_cur into l_detail_id;
            exit when l_detail_cur%notfound;

            execute immediate 'insert into item_mapping(guid,id) values(''CENDB:''||sys_guid(), :id)' using l_detail_id;

            l_insert_count := l_insert_count + sql%rowcount;

            if l_insert_count > 999 then
                l_insert_count := 0;
                commit;
            end if;
        end loop;

        close l_detail_cur;

    end loop;

    commit;
end;

作为一项规则,我会避免在循环中提交,尤其是对于 INSERT(因为它们的开销最小并且最难重新启动),但这取决于你。

【讨论】:

谢谢回复,我试试。我将在每个外部循环中插入几百万行,所以我认为定期提交比有大的待处理事务更好。顺便说一句,如果该游标的结果导致几百万行,那么使用开放游标是否“安全”? 一个大的待处理事务本身不是问题(1000 行很小)。如果发生故障,我会考虑可重新启动性。也许您可以以某种方式跟踪您在外循环中处理了哪些表名,并为每个表提交一次?然后也许你可以从你离开的地方重新开始外循环。

以上是关于循环语句中表名的动态变量的主要内容,如果未能解决你的问题,请参考以下文章

for in循环语句批量重命名的问题;bash

java在循环语句的执行语句赋予变量值循环结束后会释放吗?

1、 C语言三个循环语句分别是 语句, 语句和 语句

oracle 隐式游标,显示游标,游标循环,动态SELECT语句和动态游标,异常处理,自定义异常

SQL基本编程,分支语句,循环语句,存储过程,触发器

循环语句脚本