2009-12-17 6 views
0

Я хочу написать хранимую процедуру PLSQL, которая принимает имя таблицы в качестве аргумента. Эта таблица является исходной таблицей. Теперь в моей процедуре я хочу манипулировать полями этой таблицы. EX: Я хочу вставить записи этой исходной таблицы в другую таблицу целей, имя которой равно XYZ_<source table name>. Имена столбцов для исходных и целевых таблиц одинаковы. Но в целевой таблице могут быть дополнительные поля. Как мне это сделать? Порядок имен столбцов не одинаковый.общая хранимая процедура в oracle

+0

Предоставьте инструкцию обновления, которую вы хотите запустить, с заполнителями для переменных. –

+0

@omg ponies: спасибо, что ответили. Может, я попробовал несколько примеров кода? – user223541

ответ

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 форматирования.

+0

@apc: Theat was great.Thanks много. – user223541

1

Вы можете сделать это с помощью Dynamic SQL. Вот ссылка на основную информацию на Oracle Dynamic SQL

+0

+1 правильный. Нельзя использовать параметры запроса для имен таблиц, поэтому динамический SQL является единственным решением. –

Смежные вопросы