oracle中的通用存储过程

时间:2009-12-17 05:24:37

标签: sql oracle generics plsql

我想编写一个接受表名作为参数的PLSQL存储过程。该表是源表。现在我的程序里面我想操纵那个表的字段。 EX:我想将此源表的记录插入另一个名为XYZ_<source table name>的目标表中。源表和目标表的列名相同。但目标表中可能还有一些额外的字段。我该怎么做?列名的顺序不相同。

2 个答案:

答案 0 :(得分:4)

您必须动态构建INSERT语句。

create or replace procedure gen_insert 
   (p_src_table in user_tables.table_name%type
    , p_no_of_rows out pls_integer) 
is
    col_str varchar2(16000);
begin
    for rec in ( select column_name
                        , column_id
                 from user_tab_columns
                 where table_name = p_src_table
                 order by column_id )
    loop
        if rec.column_id != 1 then
            col_str := col_str || ',' || rec.column_name;
        else
            col_str := rec.column_name;
        end if:
    end loop;
    execute immediate 'insert into xyz_' || p_src_table || '('
                           || col_str || ')'
                           || ' select ' || col_str 
                           || ' from ' || p_src_table;
    p_no_of_rows := sql%rowcount;
end;
/        

显然,您可能希望包含一些错误处理和其他改进。

修改

编辑完问题后,我发现您对命名目标表有特殊要求,该目标表被SO格式所掩盖。

答案 1 :(得分:1)

您可以使用动态SQL执行此操作。这是一个包含Oracle Dynamic SQL

基本信息的链接