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