PROBLEMAS FORALL UPDATE

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
henry
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qui, 20 Dez 2007 10:41 am
Localização: São Paulo - SP

Olá gostaria que alguém pudesse me ajudar... eu estou tentando efetuar um update em uma tabela utilizando o forall, rowid e um update. O problema é o seguinte, embora não acuse erro a procedure, simplesmente o update não é realizado. já verifiquei no debug e o comando do forall esta sendo realizado, mas não consigo entender o porque de não estar gravando.
obs:(a versao do oracle é 8i)

segue o script:

Selecionar tudo

--DECLARAÇÃO
TYPE t_tab_NUMBER    IS TABLE OF number         INDEX BY binary_integer;
TYPE t_tab_DATE      IS TABLE OF date           INDEX BY binary_integer;
TYPE t_tab_VARCHAR2  IS TABLE OF varchar2 (100) INDEX BY binary_integer;
TYPE t_bc_a          IS TABLE OF rowid          INDEX BY binary_integer; -- Type do rowid passado pelo leo

-- Variaveis Simples
vTOTALCUSTO  number;
vTOTALVENDA  number;
vQTDETOTAL   number;
vDATAVENDA   date;

-- Vetores para uso na tabela de memória

v_tab_rowid          t_bc_a;
v_tab_TOTALCUSTO     t_tab_NUMBER;
v_tab_TOTALVENDA     t_tab_NUMBER;
v_tab_QTDETOTAL      t_tab_NUMBER;
v_tab_DATAVENDA      t_tab_DATE;

-- Variaveis de controle

v_tab_IND                      NUMBER := 1;     -- Indice
v_tam_IND                      NUMBER := 1000; -- De qtos em qtos ele vai commitar
v_tam_TOT                      NUMBER := 0;     -- Tamanho inicial do vetor de crescimento

-- Não copiei o codigo todo, mas quando o debugger chega nesse trecho os valores estao sendo corretamente atribuidos.    
   
       Select
          vTOTALCUSTO,
          vTOTALVENDA,
          vQTDETOTAL,
          vDATAVENDA,
          TAB_IMP.ROWID
       into
          v_tab_TOTALCUSTO(v_tab_IND),
          v_tab_TOTALVENDA(v_tab_IND),
          v_tab_QTDETOTAL(v_tab_IND),
          v_tab_DATAVENDA(v_tab_IND),
          v_tab_rowid(v_tab_IND)
          
       from
          dual;

       if v_tab_IND = v_tam_IND then -- quando atingir o valor de commit.

          FORALL v_ind in 1..v_tam_IND -- Update não funciona.

                 update TABELA01@rjd6t a set
                   a.CUSTOVENDAULT12MESES = v_tab_TOTALCUSTO(v_ind),
                   a.VALORVENDAULT12MESES = v_tab_TOTALVENDA(v_ind),
                   a.QTDEVENDAULT12MESES =  v_tab_QTDETOTAL(v_ind),
                   a.DATAULTIMAVENDA = v_tab_DATAVENDA(v_ind)
                 where
                   a.rowid = v_tab_rowid(v_ind); 

          v_tab_IND := 1; -- Contador volta no primeiro indice

          v_tam_TOT := v_tam_TOT + v_tam_IND; -- Registra andamento da gravação

          commit;

       else

          v_tab_IND := v_tab_IND + 1 ; -- Vai ao prox. indice

       end if;

  end;

alguém pode me ajudar? Tnksss.
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 Henry beleza?

cara você chegou a ver se essa tabela tem alguma trigger q possa estar impedindo a gravação?

[]'s
henry
Rank: Estagiário Júnior
Rank: Estagiário Júnior
Mensagens: 2
Registrado em: Qui, 20 Dez 2007 10:41 am
Localização: São Paulo - SP

Olá Cristiano,

Eu já consegui resolver o problema, como eu estava utilizando diversos bancos por DBLink, ao tentar dar um update com o forall em uma determinada tabela, simplesmente não preenchia. Dai então eu fiquei sabendo da diferença da versão dos bancos e consegui resolver.

Mas d qualquer forma, valeu aew!

Abraços!
Responder
  • Informação