общая хранимая процедура в оракуле - PullRequest
0 голосов
/ 17 декабря 2009

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

Ответы [ 2 ]

4 голосов
/ 17 декабря 2009

Вам придется динамически создавать оператор 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 голос
/ 17 декабря 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...