我无法使用以下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;
答案 0 :(得分:3)
不要那样做,尤其不要在循环中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>
答案 1 :(得分:1)
您不需要使用循环来插入这样的数据。尝试使用直接的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;
答案 2 :(得分:0)
这对我有用:
<head>
答案 3 :(得分:-1)
尝试:
BEGIN
FOR v_LoopCounter IN 1..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;