Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 в чем преимущество?  [new]
Ысяъ
Guest
вот никак не могу понять, есть ли какой-либо цинус в использовании данной конструкции
declare
type tRec is table of fdocitems%ROWTYPE;
vRows tRec;
vCur sys_refcursor;
begin
open vCur for
select ISN,DOCISN,SUBOPERISN,NO,PARTYISN,PARENTISN,NOMISN,QUANTITY,AMOUNT_CUR,AMOUNT_RUR,AMOUNT_NDS,DBCR,FOBJISN,DISCR,KINDISN,FOBJCLASSISN,MOLISN,TERRISN,USERISN,FIRMISN,CREATED,CREATEDBY,UPDATED,UPDATEDBY,FID,RELISN,CONDISN,PARTY_STATUSISN,DEPTISN from sh_fdocitems where fid = 13149316;

fetch vCur bulk collect into vRows;
if vRows.count = 0 then return; end if;
close vCur;

forall i in vRows.FIRST..vRows.LAST
insert into fdocitems
values vRows(i);
end;


против такой

insert into fdocitems
select * from sh_fdocitems
16 ноя 11, 10:15    [11603660]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
DeathHand
Member

Откуда: Мск>СПБ>Врн
Сообщений: 2705
declare
  type  tRec is table of fdocitems%ROWTYPE;
  vRows tRec;
  vCur  sys_refcursor;  
begin
  open vCur for 
    select ISN,DOCISN,SUBOPERISN,NO,PARTYISN,PARENTISN,NOMISN,QUANTITY,AMOUNT_CUR,AMOUNT_RUR,AMOUNT_NDS,DBCR,FOBJISN,DISCR,KINDISN,FOBJCLASSISN,MOLISN,TERRISN,USERISN,FIRMISN,CREATED,CREATEDBY,UPDATED,UPDATEDBY,FID,RELISN,CONDISN,PARTY_STATUSISN,DEPTISN from sh_fdocitems where fid = 13149316;   
  
  fetch vCur bulk collect into vRows; 
  if vRows.count = 0 then return; end if;
  close vCur; 
       
  forall i in vRows.FIRST..vRows.LAST
   insert into fdocitems 
     values vRows(i);      
end;

В использовании такой конструкции, "цинус"-а точно нет
16 ноя 11, 10:25    [11603749]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
DeathHand
Member

Откуда: Мск>СПБ>Врн
Сообщений: 2705
Ысяъ,

А вот если убрать рефкурсор, сократив тем самым расходы по памяти в PGA - применить select .... bulk collect into ... , при этом - иметь сложную задачу по обработке этой выборки в коллекции (такую сложную, что нельзя сделать селекте, или можно - но не красиво) - тогда, цинус есть без сомнения.
16 ноя 11, 10:28    [11603773]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
брадобрей
Member

Откуда:
Сообщений: 4696
в чем будет заключаться экономия памяти?
16 ноя 11, 10:35    [11603829]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
DeathHand
Member

Откуда: Мск>СПБ>Врн
Сообщений: 2705
брадобрей
в чем будет заключаться экономия памяти?

Хм. А наверное, нивчем. Тоже самое.

Но с select .... bulk collect into ... - букав меньше
16 ноя 11, 10:37    [11603844]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
Человек и Кошка
Member

Откуда: настоящему индейцу завсегда везде ништяк (с)
Сообщений: 830
DeathHand
bulk collect into

да не нужно оно вовсе...
16 ноя 11, 10:41    [11603878]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
Ысяъ,

Это временная заготовка, ставшая постоянным кодом )
16 ноя 11, 10:50    [11603934]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
Ысяъ
Guest
AlexFF__|,

ну получается, что не совсем, а написал это мой начальник, который вобщем разработчик наивысочайше-шего уровня...

вот и хочется понять, можт чего упустил в этой жизни?
16 ноя 11, 12:05    [11604529]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
Ысяъ
Guest
Первый случай (с курсором) кладет в память и забывает про таблицу.

Второй случай бегает по таблице и сжирает кучу памяти для апдейченных записей…



Поэтому во втором случае возможна ошибка,
16 ноя 11, 12:16    [11604611]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Человек и Кошка
DeathHand
bulk collect into

да не нужно оно вовсе...

бывает, объезд дмл-инсерта через балкон помогает в преодолении шестисотых.
16 ноя 11, 12:16    [11604614]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
orawish
Человек и Кошка
пропущено...

да не нужно оно вовсе...

бывает, объезд дмл-селекта через балкон помогает в преодолении шестисотых.

:)
16 ноя 11, 12:17    [11604623]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
AmKad
Member

Откуда:
Сообщений: 5222
Ысяъ
Первый случай (с курсором) кладет в память и забывает про таблицу.

Второй случай бегает по таблице и сжирает кучу памяти для апдейченных записей…
Ты не поверишь, но в случае с курсором он тоже бегает по таблице.
+ P.S.
Одному мне кажется что автор сравнивает неравнозначные варианты?
Ысяъ
where fid = 13149316
16 ноя 11, 12:21    [11604658]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
Человек и Кошка
Member

Откуда: настоящему индейцу завсегда везде ништяк (с)
Сообщений: 830
orawish,

нафантазировать можно много чего (dblink, например), вопрос же был (имхо) по конкретному примеру.
16 ноя 11, 12:22    [11604667]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
Человек и Кошка
Member

Откуда: настоящему индейцу завсегда везде ништяк (с)
Сообщений: 830
Ысяъ
написал это мой начальник, который вобщем разработчик наивысочайше-шего уровня

а у него спросить кишка тонка? :)
16 ноя 11, 12:24    [11604684]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
AlexFF__|
Member

Откуда:
Сообщений: 2855
Ысяъ
... написал это мой начальник, который вобщем разработчик наивысочайше-шего уровня...

По сравнению с кем?
  fetch vCur bulk collect into vRows; 
  if vRows.count = 0 then return; end if;
  close vCur;
16 ноя 11, 12:25    [11604700]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
Elic
Member

Откуда:
Сообщений: 29990
Ысяъ
наивысочайше-шего уровня...
Ас бы закрывал курсор всегда или никогда.
16 ноя 11, 12:36    [11604797]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
Ramin Hashimzade
Member

Откуда: Азербайджан, Баку
Сообщений: 9979
Блог
Ысяъ
AlexFF__|,

ну получается, что не совсем, а написал это мой начальник, который вобщем разработчик наивысочайше-шего уровня...

а ты у него спрашивал?
16 ноя 11, 12:43    [11604876]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
ORAngutang
Member

Откуда:
Сообщений: 1755
Elic
Ысяъ
наивысочайше-шего уровня...
Ас бы закрывал курсор всегда или никогда.


плюс пиццот!
16 ноя 11, 12:46    [11604895]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Человек и Кошка
orawish,

нафантазировать можно много чего (dblink, например), вопрос же был (имхо) по конкретному примеру.

ну я особо и не фатазировал. в том числе, и этот конкретный пример запросто может читать из вьюхи, внутри которой
запросто может жить засада (причина которой - да хотя бы и пристнопамятный дблинк ;).
вот я и говорю - в ситуации, когда запрос работает, а дмл из того запроса имеет ora600
- первая реакция - попробовать как оно же через коллекцию. и, если не завалится, то этой затычкой и заткнуть,
(во всяком случае, на время, пока будете копать, думать, тары-бары насчет эсеров разводить..)
16 ноя 11, 12:49    [11604934]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
Elic
Member

Откуда:
Сообщений: 29990
ORAngutang
плюс пиццот!
RTFM Правила
16 ноя 11, 12:52    [11604981]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
Ысяъ
Guest
AmKad
Ысяъ
Первый случай (с курсором) кладет в память и забывает про таблицу.

Второй случай бегает по таблице и сжирает кучу памяти для апдейченных записей…
Ты не поверишь, но в случае с курсором он тоже бегает по таблице.
+
+ P.S.
Одному мне кажется что автор сравнивает неравнозначные варианты?
Ысяъ
where fid = 13149316


да нет нет... ну забыл дописать... просто потому что вопрос именно по сути....
16 ноя 11, 13:38    [11605577]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
DeathHand
Member

Откуда: Мск>СПБ>Врн
Сообщений: 2705
Ысяъ
просто потому что вопрос именно по сути....

Зависит строго от контекста применения.
16 ноя 11, 13:55    [11605777]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
Flok
Member

Откуда:
Сообщений: 258
Ысяъ
вот никак не могу понять, есть ли какой-либо цинус в использовании данной конструкции
declare
type tRec is table of fdocitems%ROWTYPE;
vRows tRec;
vCur sys_refcursor;
begin
open vCur for
select ISN,DOCISN,SUBOPERISN,NO,PARTYISN,PARENTISN,NOMISN,QUANTITY,AMOUNT_CUR,AMOUNT_RUR,AMOUNT_NDS,DBCR,FOBJISN,DISCR,KINDISN,FOBJCLASSISN,MOLISN,TERRISN,USERISN,FIRMISN,CREATED,CREATEDBY,UPDATED,UPDATEDBY,FID,RELISN,CONDISN,PARTY_STATUSISN,DEPTISN from sh_fdocitems where fid = 13149316;

fetch vCur bulk collect into vRows;
if vRows.count = 0 then return; end if;
close vCur;

forall i in vRows.FIRST..vRows.LAST
insert into fdocitems
values vRows(i);
end;


против такой

insert into fdocitems
select * from sh_fdocitems


Использование bulk collect без limit, закрытие курсора не при любом раскладе - все это не может не настораживать.
По сути вопроса - первый способ, имхо, в данном случае предпочтительнее второго при массовой вставке только с использованием конструкции FORALL SAVE EXCEPTIONS
16 ноя 11, 14:06    [11605907]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
Elic
Member

Откуда:
Сообщений: 29990
Flok
первый способ, имхо, в данном случае предпочтительнее второго при массовой вставке только с использованием конструкции FORALL SAVE EXCEPTIONS
Против этого есть козырный туз масти log errors.
16 ноя 11, 14:32    [11606259]     Ответить | Цитировать Сообщить модератору
 Re: в чем преимущество?  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Elic
Flok
первый способ, имхо, в данном случае предпочтительнее второго при массовой вставке только с использованием конструкции FORALL SAVE EXCEPTIONS
Против этого есть козырный туз масти log errors.

вроде бы разница была. в лимите, что ли?
а вот на 11.2.0.2 сейчас попробовал
+
spool o1
set lines 300 heading off headsep off pages 0
create table ttt1 as select 1 a,owner,table_name from all_tables where rownum<1;
alter table ttt1 add check(owner not in ('SYS','SYSTEM'));
exec dbms_errlog.create_error_log('ttt1', 'ttt1_errlog');

insert into ttt1 select 1,owner,table_name from all_tables
log errors into ttt1_errlog ('инсерт-селект') reject limit 10;

declare
  type trec is table of ttt1%rowtype;
  vrows trec;
begin
  select 2,owner,table_name bulk collect into vrows
    from all_tables;
  forall i in vrows.first..vrows.last
  insert into ttt1
  values vrows(i) log errors into ttt1_errlog ('форол-балкон') reject limit 10;
end;
/
select a,count(*) from ttt1 group by a;
select cast(ora_err_number$ ||','||rtrim(ora_err_mesg$,chr(10))
                            ||','||ora_err_optyp$
                            ||','||ora_err_tag$
                            ||','||a
                            ||','||owner
                            ||','||table_name
            as varchar2(200)) e
  from ttt1_errlog;


- и разницы в упор не вижу.
+
SQL> set lines 300 heading off headsep off pages 0
SQL> create table ttt1 as select 1 a,owner,table_name from all_tables where rownum<1;

Таблица создана.

SQL> alter table ttt1 add check(owner not in ('SYS','SYSTEM'));

Таблица изменена.

SQL> exec dbms_errlog.create_error_log('ttt1', 'ttt1_errlog');

Процедура PL/SQL успешно завершена.

SQL> 
SQL> insert into ttt1 select 1,owner,table_name from all_tables
  2  log errors into ttt1_errlog ('инсерт-селект') reject limit 10;
insert into ttt1 select 1,owner,table_name from all_tables
*
ошибка в строке 1:
ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846) 


SQL> 
SQL> declare
  2    type trec is table of ttt1%rowtype;
  3    vrows trec;
  4  begin
  5    select 2,owner,table_name bulk collect into vrows
  6  	 from all_tables;
  7    forall i in vrows.first..vrows.last
  8    insert into ttt1
  9    values vrows(i) log errors into ttt1_errlog ('форол-балкон') reject limit 10;
 10  end;
 11  /
declare
*
ошибка в строке 1:
ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846) 
ORA-06512: на  line 7 


SQL> select a,count(*) from ttt1 group by a;

строки не выбраны

SQL> select cast(ora_err_number$ ||','||rtrim(ora_err_mesg$,chr(10))
  2  				 ||','||ora_err_optyp$
  3  				 ||','||ora_err_tag$
  4  				 ||','||a
  5  				 ||','||owner
  6  				 ||','||table_name
  7  		 as varchar2(200)) e
  8    from ttt1_errlog;
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,инсерт-селект,1,SYS,TYPE_MISC$                                                                                                                                                                                                  
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,инсерт-селект,1,SYS,ATTRCOL$                                                                                                                                                                                                    
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,инсерт-селект,1,SYS,ASSEMBLY$                                                                                                                                                                                                   
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,инсерт-селект,1,SYS,LIBRARY$                                                                                                                                                                                                    
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,инсерт-селект,1,SYS,VIEWTRCOL$                                                                                                                                                                                                  
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,инсерт-селект,1,SYS,ICOLDEP$                                                                                                                                                                                                    
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,инсерт-селект,1,SYS,OPQTYPE$                                                                                                                                                                                                    
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,инсерт-селект,1,SYS,REFCON$                                                                                                                                                                                                     
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,инсерт-селект,1,SYS,NTAB$                                                                                                                                                                                                       
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,инсерт-селект,1,SYS,SUBCOLTYPE$                                                                                                                                                                                                 
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,инсерт-селект,1,SYS,COLTYPE$                                                                                                                                                                                                    
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,форол-балкон,2,SYS,TYPE_MISC$                                                                                                                                                                                                   
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,форол-балкон,2,SYS,ATTRCOL$                                                                                                                                                                                                     
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,форол-балкон,2,SYS,ASSEMBLY$                                                                                                                                                                                                    
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,форол-балкон,2,SYS,LIBRARY$                                                                                                                                                                                                     
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,форол-балкон,2,SYS,VIEWTRCOL$                                                                                                                                                                                                   
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,форол-балкон,2,SYS,ICOLDEP$                                                                                                                                                                                                     
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,форол-балкон,2,SYS,OPQTYPE$                                                                                                                                                                                                     
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,форол-балкон,2,SYS,REFCON$                                                                                                                                                                                                      
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,форол-балкон,2,SYS,NTAB$                                                                                                                                                                                                        
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,форол-балкон,2,SYS,SUBCOLTYPE$                                                                                                                                                                                                  
2290,ORA-02290: нарушено ограничение целостности CHECK(STAR.SYS_C0018846),I,форол-балкон,2,SYS,COLTYPE$                                                                                                                                                                                                     

22 строк выбрано.

   
16 ноя 11, 15:42    [11607064]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Oracle Ответить