PL/SQL: ORA-01002: FETCH OUT OF SEQUENCE ?

VILMARBR 04/02/2015 15:07:32
#444290
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
VILMARBR 04/02/2015 16:35:53
#444297
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);
Tópico encerrado , respostas não são mais permitidas