我正在尝试使用Bulk Collect将数据插入表中。 这是代码:
create or replace procedure insert_via_bulk_collect authid current_user
as
lc_status number;
cursor lc_old_tb_data is select * from old_table_name;
type lc_old_tb_type is table of old_table_name%rowtype;
lc_old_tb_row lc_old_tb_type;
begin
open lc_old_tb_data;
loop
fetch lc_old_tb_data bulk collect into lc_old_tb_row;
forall i in 1..lc_old_tb_row.count
insert into new_table_name values lc_old_tb_row(i);
commit;
exit when lc_old_tb_data%notfound;
end loop;
close lc_old_tb_data;
end insert_via_bulk_collect;
它为我工作。但我想动态传递表名。 喜欢
insert_via_bulk_collect(new_tb_nm varchar2(30), old_tb_name varchar2(30))
但我无法在游标中使用这些变量并声明OLD_TABLE%rowtype
的记录。
有没有办法做到这一点?
答案 0 :(得分:0)
如评论中所述,最好使用直接Name Balance
test 500
test 3 300
。在您的情况下,您可以将此方式与insert ... select ...
:
execute immediate
答案 1 :(得分:0)
尝试以下代码
CREATE OR REPLACE PROCEDURE INSERT_VIA_BULK_COLLECT
(NEW_TABLE_NAME varchar2, OLD_TABLE_NAME varchar2)
as
l_str varchar2(4000);
begin
l_str := 'declare
CURSOR lc_old_tb_data IS SELECT * FROM ' || OLD_TABLE_NAME || ';
TYPE lc_old_tb_type IS TABLE OF '|| OLD_TABLE_NAME || '%rowtype;
lc_old_tb_row lc_old_tb_type;
begin
Open lc_old_tb_data;
loop
fetch lc_old_tb_data bulk collect into lc_old_tb_row;
FORALL i IN 1..lc_old_tb_row.count
INSERT INTO ' || NEW_TABLE_NAME || ' VALUES lc_old_tb_row(i);
COMMIT;
exit when lc_old_tb_data%notfound;
end loop;
close lc_old_tb_data;
end; ';
dbms_output.put_line (l_str);
EXECUTE IMMEDIATE l_str;
end insert_via_bulk_collect;
您可以添加例外处理。此外,建议添加数据提取限制,如下fetch lc_old_tb_data bulk collect into lc_old_tb_row l_size;
,您可以根据您的要求设置l_size值。