Ajuda bulk collect

Dúvidas, dicas e truques de PL/SQL. Aqui também vão assuntos relacionados a pacotes, triggers, funções, Java-Stored Procedures, etc
Responder
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

Bom pessoal, o problema é o seguinte....

eu tenho o seguinte loop

Selecionar tudo

 for i in vt_tpfunc.first..vt_tpfunc.last
   loop
      vv_string := ' 
         select to_number(to_char(max(mp.dt),''j'')) dt_num
              , '||vt_tpfunc(i)||'((mp.vl + nvl(mp.vl_ajuste,0)))  vl
              , max(mp.tpmovctr_id)                 tpmovctr_id
              , max(pm.nro_parc)                    nro_parc
              , max(pm.tp_parc)                     tp_parc
              , max(pm.dt_vencto)                   dt_vencto
           from mov_parc   mp
              , prev_movto pm
          where mp.dt           between '''||ed_dt_inic||'''
                                    and '''||ed_dt_fim||'''
           and mp.prevmovto_id  = pm.prevmovto_id
           and pm.contrfinan_id = '||vt_reg_contrfinan.contrfinan_id||'
           and mp.tpmovctr_id   = '||vt_tipomovctr_id(i)||'
         group by pm.contrfinan_id';
--
      execute immediate vv_string
      bulk collect into vt_dt_num
                      , vt_vl
                      , vt_tpmovctr_id
                      , vt_nro_parc
                      , vt_tp_parc
                      , vt_dt_venc;
--
   end loop; 
más no decorrer do loop, ele vai inserindo os valores por cima...
ou seja, no final do loop, os vetores do tem os valores do ultimo resultado do loop.
eu preciso que no final do loop, os vetores tenham todos os valores do loop =D

intenderam ??

vlw....
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

E ai gokden, beleza??

brow, como você declarou as variaveis vt_dt_num, vt_vl, vt_tpmovctr_id, vt_nro_parc, vt_tp_parc , vt_dt_venc ??

pergunto pelo seguinte, pra você preencher uma variavel com o bulk collect você precisa criar ela do tipo table, assim você pode acessar os valores atraves do indice, como se fosse um array, matriz.. Nesse caso se você não declarou eles como uma table provavelmente ele esteja atribuindo a variavel o valor do primeiro registro encontrado.

segue abaixo um exemplo de como utilizar o table nesse caso.

Selecionar tudo

DECLARE
   TYPE t IS TABLE OF DATE;

   l_t        t;
   v_select   VARCHAR2 (1000);
BEGIN
   v_SELECT := 'SELECT * 
                  FROM (SELECT TRUNC (SYSDATE, ''MM'') + LEVEL - 1 DATA
                          FROM DUAL
                       CONNECT BY LEVEL <= (TRUNC (LAST_DAY (SYSDATE)) - TRUNC (SYSDATE, ''MM'') + 1)) dt
                      ORDER BY dt.DATA';

   EXECUTE IMMEDIATE v_select
   BULK COLLECT INTO l_t;

   FOR x IN l_t.FIRST .. l_t.LAST
   LOOP
      DBMS_OUTPUT.put_line ('Data : ' || l_t(x) );
   END LOOP;
END;
qualquer duvida é só falar.!!

[]'s
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

aqui está a declaração dos vetores...

Selecionar tudo

  vt_dt_num      dbms_sql.number_table;
  vt_vl          dbms_sql.number_table;
  vt_tpmovctr_id dbms_sql.number_table;
  vt_nro_parc    dbms_sql.number_table;
  vt_tp_parc     dbms_sql.number_table;
  vt_dt_venc     dbms_sql.date_table;
creio eu, qui assim deveria dar certo não é? ?
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

Sim, deveria sim, abaixo eu mudei o codigo que eu fiz pra utilizar o mesmo tipo de variavel, e funcionou normalmente.

Selecionar tudo

DECLARE 
   l_d        dbms_sql.date_table;
   v_select   VARCHAR2 (1000); 
BEGIN 
   v_SELECT := 'SELECT * 
                  FROM (SELECT TRUNC (SYSDATE, ''MM'') + LEVEL - 1 DATA 
                          FROM DUAL 
                       CONNECT BY LEVEL <= (TRUNC (LAST_DAY (SYSDATE)) - TRUNC (SYSDATE, ''MM'') + 1)) dt 
                      ORDER BY dt.DATA'; 

   EXECUTE IMMEDIATE v_select 
   BULK COLLECT INTO l_d; 

   FOR x IN l_d.FIRST .. l_d.LAST 
   LOOP 
      DBMS_OUTPUT.put_line ('Data : ' || l_d(x) ); 
   END LOOP; 
END; 
na parte referente ao insert, como você fez? usou o forall? criou um loop e utilizou o indice pra cada posicao da variavel?

[]'s
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

eu só usei aquele bulk collects qui está no código mesmo....
esse é o meu insert....
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

bom cara o problema é esse mesmo....
ele vai inserindo por cima do valor do vetor....

o que eu acho qui ia dar certo, é o seguinte....
ali no Bulk Collect, eu coloco outras variaveis,
ai, logo abaixo, do bulk collect eu falo qui aqueles vetores recebem o valor deles mais o valor das outras variaveis....
uma coisa assim...

Selecionar tudo

execute immediate vv_string
bulk collect into vv_1
               , vv_2
               , vv_3
               , vv_4
               , vv_5
               , vv_6;

vt_dt_num         := vt_dt_num||vv_1;
vt_vl                 := vt_vl||vv_2;
vt_tpmovctr_id   := vt_tpmovctr_id||vv_3;
vt_nro_parc       := vt_nro_parc||vv_4;
vt_tp_parc         := vt_tp_parc||vv_5;
vt_dt_venc         := vt_dt_venc||vv_6;
será qui tem jeito ??
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

E se você tentar algo assim..

Selecionar tudo

execute immediate vv_string 
bulk collect into vv_1 
               , vv_2 
               , vv_3 
               , vv_4 
               , vv_5 
               , vv_6; 

for x in vv_1.first..vv_2.last loop
   insert into ... values (vv_1(x), vv_2(x), vv_3(x)...);
end loop;
[]'s
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

assim não iria dar, porque eu não faço insert em nenhuma tabela.....

eu só uso vetores mesmo =/

ai quebra =/
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

o que eu não estou intendo, é porque qui não está gravando na segunda posição do vetor...
ele grava somente na primeira....

por isso qui está dando esse rolo todo....
gokden
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 264
Registrado em: Dom, 19 Ago 2007 8:18 pm
Localização: Ribeirão Preto - SP
Lucas de Souza

OCA Developer
Analista de sistemas

Aewwwwww
consegui agora ;)

usei aquela nova linguamgem de programação =D
POG developer (Programação orientada a gambiarra) =X

ai deu certo..
ficou assim....

Selecionar tudo

--
      execute immediate vv_string
      bulk collect into vt_dt_num2
                      , vt_vl2
                      , vt_tpmovctr_id2
                      , vt_nro_parc2
                      , vt_tp_parc2
                      , vt_dt_venc2;
--
      vt_dt_num(i)      := vt_dt_num2(1);
      vt_vl(i)          := vt_vl2(1);
      vt_tpmovctr_id(i) := vt_tpmovctr_id2(1);
      vt_nro_parc(i)    := vt_nro_parc2(1);
      vt_tp_parc(i)     := vt_tp_parc2(1);
      vt_dt_venc(i)     := vt_dt_venc2(1);
--
;)

brigado pela ajuda ai =D
Tineks
Rank: DBA Sênior
Rank: DBA Sênior
Mensagens: 365
Registrado em: Ter, 24 Mai 2005 2:24 pm
Localização: Araraquara - SP
Cristiano (Tineks)
Araraquara - SP

É isso ai..!!

tem hora q temos q usar essas tecnicas né.. rs...

[]'s!!!
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 14 visitantes