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