我在 Oracle 中编写了下面的脚本,该脚本在表中插入数千行,并使用这些行产生的自动生成的 id 并在其他插入中使用它。
该脚本按预期工作,但问题是它需要时间才能完成。以下是当前每个表的内容的一些细节:
- table_0 包含 16000+ 行
- table_1 包含 4000+ 行
使用这些卷,脚本大约需要 15 到 20 秒。问题是我打算使用类似的查询来处理数百万行。
这是脚本调用的函数的代码:
create or replace FUNCTION get_id (name1 IN varchar2) RETURN INTEGER
as res_id INTEGER;
begin
select id into res_id from table_1 where node_type='type1' and name =
name1;
return res_id;
end;
/
这是脚本本身:
DECLARE
TYPE rt IS RECORD (text1 varchar2(20),text2 varchar(20));
TYPE texts_tab IS TABLE OF rt;
TYPE ids_tab IS TABLE OF table_1.id%TYPE;
p_texts texts_tab;
p_ids ids_tab;
id_2 integer;
CURSOR c IS
SELECT DISTINCT text1,text2 FROM table_0 order by text1,text2;
BEGIN
select FUNC1('type2') into id_2 from dual;
OPEN c;
LOOP
FETCH c BULK COLLECT INTO p_texts LIMIT 1000;
FORALL i IN 1 .. p_texts.COUNT
INSERT INTO table_2(object_id,object_type,parent_id)
VALUES (SEQ_ID.NEXTVAL, id_2 ,get_id(p_texts(i).text1) ,0,0)
RETURNING object_id BULK COLLECT INTO p_ids;
FORALL i IN 1 .. p_ids.COUNT
insert into table_3 (object_id,field2)
VALUES ( p_ids(i), p_texts(i).text2 );
FORALL i IN 1 .. p_ids.COUNT
insert into table_1 (node_type,text1,id)
VALUES('type2', p_texts(i).text1 , p_ids(i));
EXIT WHEN c%NOTFOUND;
END LOOP;
CLOSE c;
COMMIT;
END;
/