如何在 Oracle 中使用 for 循环进行插入?

新手上路,请多包涵

我无法使用以下 for 循环在 Oracle 中插入 100 万条记录。 insert 语句独立工作,但不在循环内。我在这里做错了什么?

 BEGIN
    FOR v_LoopCounter IN 385000000..1000000 LOOP
        INSERT INTO PORT (snb, real_exch, act_exch, user_type, status_id, category_id, assignable)
            VALUES (TO_CHAR(v_LoopCounter),'GSMB','GSMB','GSM',0,90,'0');
        COMMIT;
    END LOOP;
END;

原文由 Gunnlaugur 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.4k
2 个回答

不要那样做,特别是不要在循环中 COMMIT

使用 行生成器;有很多技术,其中之一是:

 SQL> create table test (snb number, real_exch varchar2(20));

Table created.

SQL> insert into test (snb, real_exch)
  2    select 385000000 + level - 1, 'GSMB'
  3    from dual
  4    connect by level <= 10;        --> you'd put a million here

10 rows created.

SQL> select * from test;

       SNB REAL_EXCH
---------- --------------------
 385000000 GSMB
 385000001 GSMB
 385000002 GSMB
 385000003 GSMB
 385000004 GSMB
 385000005 GSMB
 385000006 GSMB
 385000007 GSMB
 385000008 GSMB
 385000009 GSMB

10 rows selected.

SQL>

原文由 Littlefoot 发布,翻译遵循 CC BY-SA 4.0 许可协议

您不需要使用循环来插入这样的数据。尝试使用直接 SQL,它会以优雅的方式为您提供所需的内容

 INSERT
   INTO PORT (snb
              , real_exch
              , act_exch
              , user_type
              , status_id
              , category_id
              , assignable
             )
    select *
      from (
            SELECT row_number() over(order by 1) + 385000000 -1 as loop_val
                   ,'GSMB'
                   ,'GSMB'
                   ,'GSM'
                   ,0
                   ,90
                   ,'0'
               FROM (select level as lvl
                       from dual
                     connect by level<=1000)a
               JOIN (select level as lvl
                       from dual
                     connect by level<=1000)b
                 ON 1=1
            )x
       where x.loop_val<=385999999;

commit;

原文由 George Joseph 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进