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

Откуда: Severodvinsk
Сообщений: 362
Простите за довольно ламерский вопрос но тем не менее... Есть некая процедура proc(clob) и есть таблица со столбцом clob нужно прогнать эту процедуру по всей (или части) clob ов и результат записать на их место... Подскажите наиболее грамотную реализацию подобной вещи....
5 май 07, 12:29    [4103524]     Ответить | Цитировать Сообщить модератору
 Re: Применение процедуры ко всей таблице....  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6914
а обычный update не катит?
5 май 07, 12:39    [4103542]     Ответить | Цитировать Сообщить модератору
 Re: Применение процедуры ко всей таблице....  [new]
zhmur
Member

Откуда: Severodvinsk
Сообщений: 362
Меня интересует немного не этот момент... А как передавать клобы по очереди процедуре. И делать это наиболее оптимально.
5 май 07, 12:43    [4103552]     Ответить | Цитировать Сообщить модератору
 Re: Применение процедуры ко всей таблице....  [new]
Vladimir Sitnikov
Member

Откуда: Moscow, NetCracker
Сообщений: 407
zhmur
А как передавать клобы по очереди процедуре. И делать это наиболее оптимально.
По-моему, элегантнее будет передавать клобы не в процедуру, а в функцию:
select my_function(clob_column) from my_lob_table
Или так не будет работать?
5 май 07, 12:48    [4103556]     Ответить | Цитировать Сообщить модератору
 Re: Применение процедуры ко всей таблице....  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6914
zhmur
Меня интересует немного не этот момент... А как передавать клобы по очереди процедуре. И делать это наиболее оптимально.

сделать курсорный цикл по таблице
5 май 07, 12:49    [4103557]     Ответить | Цитировать Сообщить модератору
 Re: Применение процедуры ко всей таблице....  [new]
zhmur
Member

Откуда: Severodvinsk
Сообщений: 362
alex-ls
zhmur
Меня интересует немного не этот момент... А как передавать клобы по очереди процедуре. И делать это наиболее оптимально.

сделать курсорный цикл по таблице

А можно поподробнее....
5 май 07, 12:57    [4103570]     Ответить | Цитировать Сообщить модератору
 Re: Применение процедуры ко всей таблице....  [new]
Barmalei
Member

Откуда:
Сообщений: 83
Vladimir Sitnikov
Работать так не будет. Если функция вызывается из селекта, то она не может ничего никуда записывать (Автор вроде бы говорил о том, что таблицу менять надо...)
5 май 07, 12:59    [4103573]     Ответить | Цитировать Сообщить модератору
 Re: Применение процедуры ко всей таблице....  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6914
zhmur
alex-ls
zhmur
Меня интересует немного не этот момент... А как передавать клобы по очереди процедуре. И делать это наиболее оптимально.

сделать курсорный цикл по таблице

А можно поподробнее....

делаем что-то типа:
for rec IN (SELECT id, clob from table1) loop
  lCLOB := proc(rec.clob);
  update table1 set clob = lCLOB where id = rec.id;
end loop;

можно использовать и CURRENT OF
5 май 07, 13:21    [4103620]     Ответить | Цитировать Сообщить модератору
 Re: Применение процедуры ко всей таблице....  [new]
Vladimir Sitnikov
Member

Откуда: Moscow, NetCracker
Сообщений: 407
Barmalei
Vladimir Sitnikov
Работать так не будет. Если функция вызывается из селекта, то она не может ничего никуда записывать (Автор вроде бы говорил о том, что таблицу менять надо...)

В данном случае, работать не будет, но фраза "на не может ничего никуда записывать" неверна (см. pragma autonomous_transaction).

В данном случае, всё упирается в ora-22990: LOB locators cannot span transactions.
5 май 07, 13:26    [4103632]     Ответить | Цитировать Сообщить модератору
 Re: Применение процедуры ко всей таблице....  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6914
alex-ls

делаем что-то типа:
for rec IN (SELECT id, clob from table1) loop
  lCLOB := proc(rec.clob);
  update table1 set clob = lCLOB where id = rec.id;
end loop;

можно использовать и CURRENT OF

извиняюсь конечно же proc(rec.clob, lCLOB);
второй параметр out типа CLOB тоже наверное стоит NOCOPY делать...
5 май 07, 13:30    [4103637]     Ответить | Цитировать Сообщить модератору
 Re: Применение процедуры ко всей таблице....  [new]
zhmur
Member

Откуда: Severodvinsk
Сообщений: 362
alex-ls
zhmur
alex-ls
zhmur
Меня интересует немного не этот момент... А как передавать клобы по очереди процедуре. И делать это наиболее оптимально.

сделать курсорный цикл по таблице

А можно поподробнее....

делаем что-то типа:
for rec IN (SELECT id, clob from table1) loop
  lCLOB := proc(rec.clob);
  update table1 set clob = lCLOB where id = rec.id;
end loop;

можно использовать и CURRENT OF

А в данном случае в курсоре rec Хранится тоьлко 1 строка или весь массив данных?
5 май 07, 13:32    [4103640]     Ответить | Цитировать Сообщить модератору
 Re: Применение процедуры ко всей таблице....  [new]
alex-ls
Member

Откуда: Иркутская обл - Пенза - Москва
Сообщений: 6914
zhmur
alex-ls
zhmur
alex-ls
zhmur
Меня интересует немного не этот момент... А как передавать клобы по очереди процедуре. И делать это наиболее оптимально.

сделать курсорный цикл по таблице

А можно поподробнее....

делаем что-то типа:
for rec IN (SELECT id, clob from table1) loop
  lCLOB := proc(rec.clob);
  update table1 set clob = lCLOB where id = rec.id;
end loop;

можно использовать и CURRENT OF

А в данном случае в курсоре rec Хранится тоьлко 1 строка или весь массив данных?

одна у Вас же процедура принимает на вход одно значение CLOB и выдает соответсвенно одно. Отсюда и минус этой реализации - работать будет долго :)
5 май 07, 13:34    [4103645]     Ответить | Цитировать Сообщить модератору
 Re: Применение процедуры ко всей таблице....  [new]
zhmur
Member

Откуда: Severodvinsk
Сообщений: 362
В даном случае это плюс... Там хранится 20 гигов xml. SGA бы закончилсь...
5 май 07, 13:37    [4103650]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить