Sql oracle中的通用存储过程

Sql oracle中的通用存储过程,sql,oracle,generics,plsql,Sql,Oracle,Generics,Plsql,我想编写一个接受表名作为参数的PLSQL存储过程。此表是源表。现在,在我的过程中,我想操纵该表的字段。 例如:我想将此源表的记录插入另一个名为XYZ\uz的目标表中。源表和目标表的列名相同。但目标表中可能有一些额外的字段。我该怎么做?列名的顺序不同。您可以使用动态SQL来实现这一点。这里有一个关于基本信息的链接,您可以使用动态SQL执行此操作。这里有一个关于基本信息的链接,您必须动态地构建INSERT语句 create or replace procedure gen_insert (p

我想编写一个接受表名作为参数的PLSQL存储过程。此表是源表。现在,在我的过程中,我想操纵该表的字段。
例如:我想将此源表的记录插入另一个名为
XYZ\uz
的目标表中。源表和目标表的列名相同。但目标表中可能有一些额外的字段。我该怎么做?列名的顺序不同。

您可以使用动态SQL来实现这一点。这里有一个关于基本信息的链接,您可以使用动态SQL执行此操作。这里有一个关于基本信息的链接,您必须动态地构建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格式所掩盖。

您必须动态生成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格式模糊的目标表有特殊要求。

提供要运行的update语句,并为变量提供占位符。@omg ponies:感谢您的回答。您能提供一些示例代码吗?提供要运行的update语句,带有变量的占位符。@omg ponies:谢谢您的回复。您能提供一些示例代码吗?+1正确。不能对表名使用查询参数,因此动态SQL是唯一的解决方案。+1正确。不能对表名使用查询参数,所以动态SQL是唯一的解决方案。@apc:Theat很棒。非常感谢。@apc:Theat很棒。非常感谢。