Ajuda com select into em procedure

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
markee
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 26 Nov 2009 1:34 pm
Localização: São Paulo - SP
| rOx | =D

Boa tarde galera,

estou desenvolvendo uma procedure e me deparei com a seguinte situação:

Eu executo 2 selects into para realizar uma validação, com base nos dados de um cursor, porém como cursores implicitos retornam exception quando não encontram registros, ele acaba saindo da proc, pois já tenho alguns excption handlers...

segue abaixo o código para melhor visualização:

Selecionar tudo

CREATE OR REPLACE PROCEDURE C_BCRC120 AS

cursor creg is select * from bcrc120 order by id;

v_creg creg%rowtype;
v_cfop varchar2(4);
v_cfop2 varchar2(4);
v_erro_bcrc120 exception;
v_ind_oper bcrc100.ind_oper%type;

BEGIN

-- abre cursor
  open creg;
  FETCH creg INTO v_creg;
  IF creg%NOTFOUND THEN
     RAISE v_erro_bcrc120;
  END IF;
  
  LOOP
  -- Valida o campo COD_DOC_IMP
      verif_valor_campo(v_creg.id, v_creg.reg, v_creg.cod_doc_imp, 'COD_DOC_IMP');
      
      select ind_oper into v_ind_oper from bcrc100 where id = v_creg.id_c100;
      select SUBSTR(CFOP, 1, 1) INTO v_cfop from bcrc170
      where id_c100 = v_creg.id_c100;
      select SUBSTR(CFOP, 1, 1)INTO v_cfop2 from bcrc190
      where id_c170 = (select id from bcrc170 where id_c100 = v_creg.id_c100);
     
      
  -- Verifica se o registro está dentro das regras de importação
      IF v_ind_oper = '0' and( v_cfop <> '3' or v_cfop2 <> '3') THEN
        gravar_critica(v_creg.id, v_creg.reg, v_creg.id_c100, '', busca_erro(1055), 'ID_C100');
      END IF;   
        
      FETCH creg INTO v_creg;
      EXIT WHEN creg%NOTFOUND;
  END LOOP;
  
  close creg;
  
  EXCEPTION 
  WHEN v_erro_bcrc120 THEN NULL;
  WHEN others THEN NULL;
  
END;
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

cara..

pelo que entendi ta saindo porque o erro q é gerado você não esta tratando..

seria o NO_DATA_FOUND
caso seu select into não retorne dado

e pode ocorrer tambem um TOO_MANY_ROWS
caso o seu select into retorno mais de uma linha

http://www.java2s.com/Tutorial/Oracle/0 ... eption.htm
markee
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 26 Nov 2009 1:34 pm
Localização: São Paulo - SP
| rOx | =D

Então...

eu sei q o erro é de no_data_found, mas eu quero que ele siga mesmo sem esse valor... sabe me dizer o q fazer?

vlw
victorhugomuniz
Moderador
Moderador
Mensagens: 1396
Registrado em: Sex, 01 Fev 2008 2:06 pm
Localização: Rio de Janeiro - RJ
Contato:
:D

Selecionar tudo

when NO_DATA_FOUND 
    ind_oper :=  null;
    v_cfop := null;
rogenaro
Rank: DBA Pleno
Rank: DBA Pleno
Mensagens: 232
Registrado em: Sex, 30 Mar 2007 7:26 pm
Localização: Londrina - PR
Rafael O. Genaro

Outra coisa.. não trate as exceções no final da procedure, faça um

Selecionar tudo

begin 
... 
exception
...
end
para as duas consultas, a fim de tratar as exceções apenas destas queries.
(da forma que está, se o primeiro registro do seu cursor principal levantar uma exceção, o programa vai parar neste ponto e nada mais será processado).

E a não ser que seja uma procedure apenas para testes ou para uso único, recomendo retirar o when others then null, pois este tipo de prática torna extremamente díficil identificar erros posteriormente, pois apenas disfarça o problema... se a procedure verif_valor_campo, por exemplo, estiver gerando algum erro, dificilmente a pessoa que estiver executando a procedure C_BCRC120 se dará conta disso, já que a procedure sempre será executada com sucesso.
markee
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 26 Nov 2009 1:34 pm
Localização: São Paulo - SP
| rOx | =D

Vlw galera!

Deu certo aqui.

=)

Cya

Marcos
Responder
  • Informação
  • Quem está online

    Usuários navegando neste fórum: Nenhum usuário registrado e 1 visitante