none
PL/SQL: ORA-01002: fetch out of sequence ? RRS feed

  • Pergunta

  • Alguém já teve este erro usando tabela temporária: ORA-01002: fetch out of sequence ??

    Ao executar a proc  no oracle developer retorna os dados, porém proc faz um INSERT e dois UPDATES sem commit.

    No .NET quando chamamos esta proc dá erro “ORA-01002: fetch out of sequence”. Ao “googlearmos” o pessoal cita que é falta de commit/rollback. Colocamos, mas aí para de retornar dados nos testes diretamente no Oracle Developer.

    Sabe me dizer como deve se proceder com tabela temporária em relação as aplicações asp.net onde ocorrem operações de inclusão, alterações e exclusão?

    Grato.

    CRIAÇÃO DA TABELA:

    create global temporary table  GT01_DEPENDENCIA

    (

    cod_cnpj_raiz_ittc number (8) .....

    ... demais campos

    )

    PROC:

      procedure sp_get_dependencia (
                                    p_cod_cnpj_raiz_ittc   number,                                
                                    p_cod_sfxo_cnpj_dpca   number,                                 
                                    p_cod_erro             out number,
                                    p_msg_erro             out varchar,
                                    p_recordset            out ref_cursor
                                    ) is
    v_exists number;
      v_cnpj_ittc_ini number;
    v_cnpj_ittc_fim number;
    v_sfxo_dpca_ini number;
      v_sfxo_dpca_fim number;    
      
      --Variáveis para pegar dados do correio
      v_cep varchar2(9);
      v_cod_tip_log varchar2(3);
      v_nom_log varchar2(100);
      v_nom_bai varchar2(72);
      v_txt_cplm varchar2(100);
      v_nom_lcld varchar2(72);
      v_sgl_uf varchar2(2);
      
      --Variáveis para pegar dados de paralização
      v_dt_inic_prlz date;
      v_dt_fim_prlz date;  
      
     cursor correio_cur is
        select cod_cep_log from GT01_DEPENDENCIA; 
        
        cod_cep_log correio_cur%ROWTYPE;

     cursor paralizacao_cur is
          select
            dt_inic_prlz,
            dt_fim_prlz
          from 
            t9088_per_prz_dpca
          where 
            cod_cnpj_raiz_ittc = p_cod_cnpj_raiz_ittc
          and 
            cod_sfxo_cnpj_dpca = p_cod_sfxo_cnpj_dpca
          order by 
            dt_inic_prlz desc; 
            
        dt_inic_prlz paralizacao_cur%ROWTYPE;    
           
      begin
        p_cod_erro := 0;
        p_msg_erro := 'Operação realizada com sucesso';
        
        if p_cod_cnpj_raiz_ittc is null then
          v_cnpj_ittc_ini := 0;
          v_cnpj_ittc_fim := 99999;
        else
          v_cnpj_ittc_ini := p_cod_cnpj_raiz_ittc;
          v_cnpj_ittc_fim := p_cod_cnpj_raiz_ittc;    
        end if;
        
        if p_cod_sfxo_cnpj_dpca is null then
          v_sfxo_dpca_ini := 0;
          v_sfxo_dpca_fim := 99999;
        else
          v_sfxo_dpca_ini := p_cod_sfxo_cnpj_dpca;
          v_sfxo_dpca_fim := p_cod_sfxo_cnpj_dpca;    
        end if;    
        
        select  
            count(*) into v_exists
        from 
            t9081_dpca_ittc t1
        inner join 
            t9085_tip_dpca t2 on t1.cod_tip_dpca = t1.cod_tip_dpca
        where 
            t1.cod_cnpj_raiz_ittc between v_cnpj_ittc_ini and v_cnpj_ittc_fim
        and 
            t1.cod_sfxo_cnpj_dpca between v_sfxo_dpca_ini and v_sfxo_dpca_fim;
          
        if v_exists = 0 then
          p_cod_erro := 10;
          p_msg_erro := 'CNPJ Raiz não encontrado.';
        
          open p_recordset for select * from dual where 1=2;
          return;
        end if;      

        --Início: Limpar/Inserir dados na tabela temporária.
        execute immediate 'truncate table GT01_DEPENDENCIA';
      
      begin
       insert into GT01_DEPENDENCIA   
        select
          t1.cod_cnpj_raiz_ittc,  
       t1.cod_sfxo_cnpj_dpca,  
       t1.ind_cnlz_cntb,  
       t2.txt_tip_dpca,  
       t1.cod_ccm_dpca,  
       t1.dt_inic_atvd,  
       t1.dt_fim_atvd,   
          '' as cod_tip_logdr,
          '' as txt_nom_logdr,
       t1.cod_nro_log_ittc,  
       t1.txt_cplm_log_ittc,  
          '' as txt_nom_bai, 
       t1.cod_cep_log,  
          null as dt_inic_prlz,
          null as dt_fim_prlz,
          t1.cod_sfxo_cnpj_cntb
       from
     t9081_dpca_ittc t1  
       inner join  
     t9085_tip_dpca t2 on t1.cod_tip_dpca = t1.cod_tip_dpca  
       where  
      t1.cod_cnpj_raiz_ittc between v_cnpj_ittc_ini and v_cnpj_ittc_fim 
       and  
      t1.cod_sfxo_cnpj_dpca between v_sfxo_dpca_ini and v_sfxo_dpca_fim;
         
    --    commit;     
       --Fim: Limpar/Inserir dados na tabela temporária.   
        
       --Início: Atualizar dados do correio.
       open correio_cur;
          loop
             fetch correio_cur into v_cep;
             exit when correio_cur%notfound;         
      
               --Chamada de procedure corporativa para acessar base do correio.
                pp9369.dnec1p01.ceplogun (lpad(v_cep, 8, '0'),v_cod_tip_log,v_nom_log,v_txt_cplm,v_nom_bai,v_nom_lcld,v_sgl_uf);
             
             update 
                GT01_DEPENDENCIA 
             set 
                cod_tip_logdr = v_cod_tip_log,
                txt_nom_logdr = v_nom_log,
                txt_nom_bai   = v_nom_bai
             where                             
                cod_cep_log = to_number(v_cep,'99999999');            
          end loop;

    --      commit;
        close correio_cur;  
       --Fim: Atualizar dados do correio.    
       
       --Início: Atualizar dados de paralização.
       open paralizacao_cur;
          loop
             fetch paralizacao_cur into v_dt_inic_prlz,v_dt_fim_prlz;
             exit when paralizacao_cur%notfound;
             
             update 
                GT01_DEPENDENCIA 
             set 
                dt_inic_prlz = v_dt_inic_prlz,
                dt_fim_prlz = v_dt_fim_prlz
             where 
                cod_cnpj_raiz_ittc = p_cod_cnpj_raiz_ittc
             and 
                cod_sfxo_cnpj_dpca = p_cod_sfxo_cnpj_dpca;    
             
    --         commit;        
          end loop;

        close paralizacao_cur;
       --Fim: Atualizar dados de paralização.
       
       --Início: retorno final desta proc.   
        open p_recordset for 
          select
            cod_cnpj_raiz_ittc CnpjRaiz,  
            cod_sfxo_cnpj_dpca Sufixo,  
            ind_cnlz_cntb IndCentrContabil,  
            txt_tip_dpca Tipo,  
            cod_ccm_dpca Ccm,  
            dt_inic_atvd DataInicio,  
            dt_fim_atvd DataFinal,   
            cod_tip_logdr TipoLogradouro,
            txt_nom_logdr Logradouro,
            cod_nro_log_ittc Numero,  
            txt_cplm_log_ittc Complemento,  
            txt_nom_bai Bairro, 
            cod_cep_log Cep,  
            dt_inic_prlz DataInicioParalizacao,
            dt_fim_prlz DataFinalParalizacao,
            cod_sfxo_cnpj_cntb SufixoCentrContabil      
          from 
             GT01_DEPENDENCIA;
          --Fim: retorno final desta proc.    
       end;
       
    --   commit;
          
      exception
        when others then      
          p_cod_erro := sqlcode;
          p_msg_erro := sqlerrm;
          
    --      rollback;
      end;


    http://www.vilmarbro.com.br


    • Editado vilmarbro quarta-feira, 4 de fevereiro de 2015 17:03
    quarta-feira, 4 de fevereiro de 2015 17:01

Respostas

  • Resolvido:

                //Executa o acesso a procedure.
                odr = cmd.ExecuteReader();

    Não pode fechar a conexão qdo instanciar o datareader. Assim conforme abaixo dava erro:
    odr = cmd.ExecuteReader(CommandBehavior.CloseConnection);


    http://www.vilmarbro.com.br

    quarta-feira, 4 de fevereiro de 2015 18:35