使用过程的输入参数来声明%Rowtype记录

时间:2017-12-11 07:58:25

标签: oracle plsql

我正在尝试使用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的记录。 有没有办法做到这一点?

2 个答案:

答案 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值。