Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Разделение больших таблиц  [new]
pavel*
Guest
Здравствуйте, коллеги!
Может кто сталкивался с ситуацией когда из исходной таблицы (оч много млн. записей)
требуется положить в две других с некими преобразованиями.

Хотел использовать bulk collect ... limit для отбора записей. Дальше перегонять в две других коллекции с преобразованиями и вставлять полученные данные forallом.
Все бы ничего но алгоритм уперся в удаление данных из исходной таблицы, имхо первичного ключа в ней нет.
По rowid тоже не получается т.к оракл не видит rowid в колекции созданной на основе rowtype.
Создавать кучу коллекций на основе столбцов тоже оч не хочется т.к. их просто дохрена
26 ноя 10, 15:08    [9845731]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
-2-
Member

Откуда:
Сообщений: 15330
pavel*
т.к оракл не видит rowid в колекции созданной на основе rowtype

   cursor cur is select rowid r, t.* from dual t;
   rec cur%rowtype;
26 ноя 10, 15:12    [9845773]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
pavel*
Guest
-2-
pavel*
т.к оракл не видит rowid в колекции созданной на основе rowtype

   cursor cur is select rowid r, t.* from dual t;
   rec cur%rowtype;

при использовании записей придется вытащить всю таблицу, а она оч. большая
боюсь пга треснет. да можно ограничить по rownum, но сколько раз дергать тогда дергать неизвестно, да и весь эффект от bulk тогда исчезнет, начнется переключение контекста на каждую запись.
у меня
 
DECLARE
    TYPE typ_src_tab IS TABLE OF my_tab%ROWTYPE;
    p_src_tab typ_src_tab := typ_src_tab();
BEGIN
....
      p_src_tab(i).rowid --ошибка
...
[/quot]
26 ноя 10, 15:34    [9845975]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
-2-
Member

Откуда:
Сообщений: 15330
pavel*,

зачем rownum? ты б сначала научился лимитировать потребление булков, чтобы ничего не треснуло.
И в приведенный мной пример вглядись повнимательней...
26 ноя 10, 15:38    [9846022]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
а если ещё подумать?
   cursor cur is select rowid r, t.* from dual t;
   TYPE typ_src_tab IS TABLE OF cur%rowtype;
   p_src_tab typ_src_tab := typ_src_tab();
26 ноя 10, 15:42    [9846046]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
pavel*
Guest
-2-,

очень внимательно вгляделся
если напишете код с булком на основе своего предложения с меня пиво :)
26 ноя 10, 15:43    [9846065]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
pavel*
Guest
_Nikotin,

тоже не работает
26 ноя 10, 15:44    [9846075]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
-2-
Member

Откуда:
Сообщений: 15330
set serveroutput on 
declare
   cursor cur is select rowid r, t.* from sys.obj$ t;
   type typ is table of cur%rowtype index by binary_integer;
   var  typ;
begin
   open cur;
   fetch cur bulk collect into var limit 10 ;
   dbms_output.put_line(var(1).r);
   fetch cur bulk collect into var limit 10 ;
   dbms_output.put_line(var(1).r);
   close cur;
end;
/

AAAAASAABAAAAB5AAA
AAAAASAABAAAAB5AAK 
-- K-A=10
26 ноя 10, 15:45    [9846076]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
pavel*
Дальше перегонять в две других коллекции с преобразованиями и вставлять полученные данные forallом. ...
Создавать кучу коллекций на основе столбцов тоже оч не хочется т.к. их просто дохрена

Если таблицы имеют разную структуру то всё равно придётся жетко кодить.
26 ноя 10, 15:51    [9846122]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
pavel*,
Guest
-2-
set serveroutput on 
declare
   cursor cur is select rowid r, t.* from sys.obj$ t;
   type typ is table of cur%rowtype index by binary_integer;
   var  typ;
begin
   open cur;
   fetch cur bulk collect into var limit 10 ;
   dbms_output.put_line(var(1).r);
   fetch cur bulk collect into var limit 10 ;
   dbms_output.put_line(var(1).r);
   close cur;
end;
/

AAAAASAABAAAAB5AAA
AAAAASAABAAAAB5AAK 
-- K-A=10


а у мну PLS-00597: выражение 'VAR' в списке INTO имеет неверный тип :((
простите, а это под какой версией оракла.
просто у меня 9.2, забыл сказать :)
26 ноя 10, 15:52    [9846129]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
pavel*,
Guest
[/quot]
Если таблицы имеют разную структуру то всё равно придётся жетко кодить.[/quot]


не, название колонок и тип одинаковые, количество правда разное. но небеда, этот блок собирается в nds там колонки и подставляются какие нужны из all_tab_columns
26 ноя 10, 16:01    [9846212]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
_Nikotin
Member

Откуда: СПб
Сообщений: 2965
pavel*,
а у мну PLS-00597: выражение 'VAR' в списке INTO имеет неверный тип :((

покажите как объявлен курсор, тип и как делается fetch
26 ноя 10, 16:04    [9846243]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
pavel*
Guest
_Nikotin
pavel*,
а у мну PLS-00597: выражение 'VAR' в списке INTO имеет неверный тип :((

покажите как объявлен курсор, тип и как делается fetch


ну так код автора универсален :)

declare
   cursor cur is select rowid r, t.* from sys.obj$ t;
   type typ is table of cur%rowtype index by binary_integer;
   var  typ;
begin
   open cur;
   fetch cur bulk collect into var limit 10 ; -- в 9.2 ошибка !!!
   dbms_output.put_line(var(1).r);
   fetch cur bulk collect into var limit 10 ;
   dbms_output.put_line(var(1).r);
   close cur;
end;

-2- , ау-у. под какой версией собралось. у нас через 2 месяца 11.2 приходит.
если прикол в версии то даже голову ломать не буду :)
26 ноя 10, 16:13    [9846318]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
-2-
Member

Откуда:
Сообщений: 15330
pavel*
-2- , ау-у. под какой версией собралось
Че не глянуть в доку?!
Насколько помню, было и в девятке.

Проблема, скорее, в доступе к sys.obj$.
26 ноя 10, 16:27    [9846455]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
-2-
Member

Откуда:
Сообщений: 15330
И про возможное изменение rowid в процессе обработки не стоит забывать.
26 ноя 10, 16:29    [9846476]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
pavel*
Guest
-2-
pavel*
-2- , ау-у. под какой версией собралось
Че не глянуть в доку?!
Насколько помню, было и в девятке.

Проблема, скорее, в доступе к sys.obj$.


Проблема доступа, ораклом завется как:
PL/SQL: ORA-00942: таблица или представление пользователя не существует

А в чем подвох, назвать версию?
26 ноя 10, 16:31    [9846491]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
pavel*
Guest
-2-
И про возможное изменение rowid в процессе обработки не стоит забывать.


угу, наслышан с 8i поперло. но данные которые будут перетягиваться уже не апдейтятся
а в данном случае rowid должен быть постоянен. но даже если и не сожрет что-либо, в следующий раз захватит - в моем случае не критично.
26 ноя 10, 16:38    [9846573]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
env
Member

Откуда: Россия, Москва
Сообщений: 6727
-2-,

12 beta1?
26 ноя 10, 16:42    [9846603]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
Tamozhnya
Member

Откуда:
Сообщений: 121
declare
   cursor cur is select rowid r, t.* from sys.obj$ t;
   type typ is table of cur%rowtype index by binary_integer;
   var  typ;
begin
   open cur;
   fetch cur bulk collect into var limit 10 ; -- в 9.2 ошибка !!!
   dbms_output.put_line(var(1).r);
   fetch cur bulk collect into var limit 10 ;
   dbms_output.put_line(var(1).r);
   close cur;
end;

Законнектился на sys. На 9ir2 работает
26 ноя 10, 17:02    [9846774]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
pavel*
Guest
Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0 
Connected as system

declare
   cursor cur is select rowid r, t.* from sys.obj$ t;
   type typ is table of cur%rowtype index by binary_integer;
   var  typ;
begin
   open cur;
   fetch cur bulk collect into var limit 10 ; -- в 9.2 ошибка !!!
   dbms_output.put_line(var(1).r);
   fetch cur bulk collect into var limit 10 ;
   dbms_output.put_line(var(1).r);
   close cur;
end;
 
ORA-06550: line 8, column 32:
PLS-00597: expression 'VAR' in the INTO list is of wrong type
ORA-06550: line 8, column 4:
PL/SQL: SQL Statement ignored
ORA-06550: line 10, column 32:
PLS-00597: expression 'VAR' in the INTO list is of wrong type
ORA-06550: line 10, column 4:
PL/SQL: SQL Statement ignored
[SRC oracle]
Connected to Oracle9i Enterprise Edition Release 9.2.0.8.0 
Connected as system

declare
   cursor cur is select rowid r, t.* from sys.obj$ t;
   type typ is table of cur%rowtype index by binary_integer;
   var  typ;
begin
   open cur;
   fetch cur bulk collect into var limit 10 ; -- в 9.2 ошибка !!!
   dbms_output.put_line(var(1).r);
   fetch cur bulk collect into var limit 10 ;
   dbms_output.put_line(var(1).r);
   close cur;
end;

AAAAASAABAAAAB6AAA
AAAAASAABAAAAB6AAK
 
PL/SQL procedure successfully completed


Патчится мля надо вовремя :)
Всем спасибо!
-2- респект, жду координаты для сброса пива!
27 ноя 10, 09:45    [9849507]     Ответить | Цитировать Сообщить модератору
 Re: Разделение больших таблиц  [new]
pavel*
Guest
Connected to Oracle9i Enterprise Edition Release 9.2.0.1.0 
Connected as system

declare
   cursor cur is select rowid r, t.* from sys.obj$ t;
   type typ is table of cur%rowtype index by binary_integer;
   var  typ;
begin
   open cur;
   fetch cur bulk collect into var limit 10 ; -- в 9.2 ошибка !!!
   dbms_output.put_line(var(1).r);
   fetch cur bulk collect into var limit 10 ;
   dbms_output.put_line(var(1).r);
   close cur;
end;
 
ORA-06550: line 8, column 32:
PLS-00597: expression 'VAR' in the INTO list is of wrong type
ORA-06550: line 8, column 4:
PL/SQL: SQL Statement ignored
ORA-06550: line 10, column 32:
PLS-00597: expression 'VAR' in the INTO list is of wrong type
ORA-06550: line 10, column 4:
PL/SQL: SQL Statement ignored
[SRC oracle]
Connected to Oracle9i Enterprise Edition Release 9.2.0.8.0 
Connected as system

declare
   cursor cur is select rowid r, t.* from sys.obj$ t;
   type typ is table of cur%rowtype index by binary_integer;
   var  typ;
begin
   open cur;
   fetch cur bulk collect into var limit 10 ; -- в 9.2 ошибка !!!
   dbms_output.put_line(var(1).r);
   fetch cur bulk collect into var limit 10 ;
   dbms_output.put_line(var(1).r);
   close cur;
end;

AAAAASAABAAAAB6AAA
AAAAASAABAAAAB6AAK
 
PL/SQL procedure successfully completed


Патчится мля надо вовремя :)
Всем спасибо!
-2- респект, жду координаты для сброса пива!
27 ноя 10, 10:00    [9849514]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить