Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Оптимизация решения задачи  [new]
disobidient
Member

Откуда:
Сообщений: 29
Добрый день, форумчане!
Помогите пожалуйста найти более оптимальное решение задачи:
Есть входная таблица in_user_list с описанием сущности user, также есть аналогичная выходная таблица out_user_list, куда будут попадать откорректированные данные.
user_changes - таблица корректировок, с описанием в какое поле и какое значение должно быть установлено.

Необходимо написать процедуру apply_changes, которая будет переносить строку из in_user_list в out_user_list с применением корректировок из user_changes.

Я придумал динамически генерить "insert select" для каждой строки с подстановкой новых значений, но это дело работает долго.
Подскажите, возможно ли, как-нибудь ускорить это дело? Возможно ли использовать в таком случае bulk collect?


Заранее спасибо за помощь!

PS таблица out_user_list чиститься после каждого выполнения apply_changes

+

create table in_user_list(
user_id number,
user_name varchar2(4000) not null,
office varchar2(300), 
addr_id number not null, 
group_id number, 
user_add_info varchar2(4000), 
user_alias varchar2(4000),
zipcode varchar2(6),
created date default sysdate,
last_updated date default sysdate,
display_type char(1),
is_deleted char(1),
is_locked char(1),
is_visible char(1),
security_level number,
email varchar2(4000),
phone varchar2(100),
faxnumber varchar2(100),
photo_url varchar2(300),
organization_id number,
constraint pk_in_user_list primary key (user_id)
);

create table out_user_list(
user_id number,
user_name varchar2(4000) not null,
office varchar2(300), 
addr_id number not null, 
group_id number, 
user_add_info varchar2(4000), 
user_alias varchar2(4000),
zipcode varchar2(6),
created date default sysdate,
last_updated date default sysdate,
display_type char(1),
is_deleted char(1),
is_locked char(1),
is_visible char(1),
security_level number,
email varchar2(4000),
phone varchar2(100),
faxnumber varchar2(100),
photo_url varchar2(300),
organization_id number,
constraint pk_out_user_list primary key (user_id)
);

create table user_changes (
change_id number,
user_id number,
column_name varchar2(30),
column_type varchar2(100),
new_value varchar2(4000),
constraint pk_user_changes primary key (change_id, user_id)
);


create procedure apply_changes(p_change_id number)
is
l_col_list varchar2(500) := 'user_id,user_name,office,addr_id,group_id,user_add_info,user_alias,zipcode,created,last_updated,display_type,is_deleted,is_locked,is_visible,security_level,email,phone,faxnumber,photo_url,organization_id';
l_sql varchar2(32000);
l_sel_columns varchar2(32000);
function use_type(p_value varchar2, p_type varchar2) return varchar2
is
begin
  case lower(p_type)
    when 'char' then return ''''||p_value||'''';
    when 'number' then return p_value;
    when 'date' then return 'to_date('''||p_value||''',''hh24:mm:ss dd.mm.yyyy'')';
  end case;
end use_type;
begin
  for ch_rec in (select change_id, user_id, column_name, column_type, new_value from user_changes where change_id = p_change_id)
  loop
    l_sel_columns := replace(l_col_list, lower(ch_rec.column_name), use_type(ch_rec.new_value, ch_rec.column_type));
    l_sql := 'insert into out_user_list('||l_col_list||')'||
             ' select '||l_sel_columns||
             ' from in_user_list
               where user_id = :1';
    execute immediate l_sql using ch_rec.user_id;                  
  end loop;
  commit; 
end apply_changes;

14 мар 13, 01:43    [14045405]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация решения задачи  [new]
wurdu
Member

Откуда: Владивосток
Сообщений: 4441
Делаешь user_changes по шаблону с ..._user_list и одним insert into out_user_list ... select ... from user_changes переносишь. Без всяких циклов, динамических sql и бессмысленных абстракций типа текущей реализации user_changes.
14 мар 13, 03:04    [14045470]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация решения задачи  [new]
disobidient
Member

Откуда:
Сообщений: 29
wurdu,
дело в том, что изменения приходят из внешней системы и в таком формате. Народ, возможно у кого-нибудь есть идеи, как ускорить это дело?
14 мар 13, 16:23    [14048516]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация решения задачи  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Запросто.
1. Отказаться от динамики в пользу статического sql.
2. Пошукать по форуму pivot, применить к changes
3. Соединить выборку из in_list с pivot, использоваться nvl или coalesce
4. Итоговый select скормить insert-у.
14 мар 13, 16:39    [14048641]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить