Exception pl/sql

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
dejambo
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 27 Jun 2012 8:58 am

Bom dia a todos.

Tenho uma exception como a abaixo:

Selecionar tudo

begin
       begin
             select x
             into t
             from tabela
    
            exception
             when no_data_found then
               insert tabela_log...
     end;
end;
O problema é que a exceção não está sendo lançada quando deveria, sendo que existem casos para isso acontecer. O que há de errado?

Obrigado.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Este exception só vai ser disparado caso houver NO_DATA_FOUND.
Se alguma outra exceção estiver sendo feita, ele não vai capturar.

Por exemplo, eu não vi WHERE no seu SELECT. Portanto, se tiver mais que uma linha na sua tabela, ele vai gerar TOO_MANY_ROWS.

Faça um teste aí.
Coloque na WHERE 1=2 (pra provocar que nenhuma linha retorne).
dejambo
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 27 Jun 2012 8:58 am

E aí dr_gori. Coloquei resumido meu select, mas o select original faz um sdo_aggr_union de todas as geometrias filtrando por um id, no final só retorna uma linha:

Selecionar tudo

SELECT SDO_AGGR_UNION(MDSYS.SDOAGGRTYPE(campo geom, 0.00005))
         INTO vTHE_GEOM_AC
        FROM tabela_geoac
        WHERE id= id;
dejambo
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 27 Jun 2012 8:58 am

Esse select está dentro de um cursor.
Avatar do usuário
dr_gori
Moderador
Moderador
Mensagens: 5024
Registrado em: Seg, 03 Mai 2004 3:08 pm
Localização: Portland, OR USA
Contato:
Thomas F. G

Você já respondeu a dúvida de alguém hoje?
https://glufke.net/oracle/search.php?search_id=unanswered

Você diz que esse SELECT é a query do cursor ?
Se é isso, então é esse o problema. O cursor não gera exception NO_DATA_FOUND quando não encontra linha, ele simplesmente não entra. (Se for um FOR cursor LOOP).
Se for um cursor explícito (OPEN CURSOR, FETCH, etc), aí tem que testar com cursor%NOTFOUND.

Se for possível, coloca pra nós um trecho do seu código. (pode tirar o select original).
É que fica meio difícil da gente entender o que ta errado sem ver.
:oops:
dejambo
Rank: Programador Sênior
Rank: Programador Sênior
Mensagens: 68
Registrado em: Qua, 27 Jun 2012 8:58 am

Boa noite dr_gori. Segue abaixo o select original:

Selecionar tudo

CREATE OR REPLACE PROCEDURE procedimento_teste IS 

vcod NUMBER;
vthe_geom SDO_GEOMETRY;
vthe_geom_ai SDO_GEOMETRY;
vthe_geom_ac SDO_GEOMETRY;
vid NUMBER;
e_teste EXCEPTION;
vMsgErro VARCHAR2(100);
PRAGMA EXCEPTION_INIT (e_teste, -13050);


CURSOR cursor_teste IS
	SELECT id, cod, the_geom	FROM tabela_geo1  WHERE cod;

BEGIN

  OPEN cursor_teste;

	  FETCH cursor_teste INTO vid, vcod, vthe_geom;

  	WHILE cursor_teste%FOUND LOOP
      BEGIN

        SELECT SDO_AGGR_UNION(MDSYS.SDOAGGRTYPE(ac.the_geom, 0.00005))
        INTO vthe_geom_ac
        FROM tabela_geo2 ac
        WHERE cod = vcod;

        EXCEPTION
          WHEN NO_DATA_FOUND THEN
            INSERT INTO tabela_log VALUES (NULL, vcod, 'NO_DATA_FOUND', 'NOME_PROCEDURE', 'tabela_geo1', vid, null);

          WHEN e_teste THEN
            INSERT INTO tabela_log VALUES (NULL, vcod, 'ORA - 13050 não foi possível construir objeto espacial.', 'NOME_PROCEDURE', 'tabela_geo1', NULL, null);

      END;

      BEGIN

        SELECT ai.THE_GEOM
        INTO vthe_geom_ai
        FROM tabela_geo3 ai
        WHERE cod = vcod;

        EXCEPTION
          WHEN NO_DATA_FOUND THEN
            INSERT INTO tabela_log VALUES (NULL, vcod, 'NO_DATA_FOUND', 'NOME_PROCEDURE', 'tabela_geo1', vid, null);

      END;

    --processamento
    --processamento

    FETCH cursor_teste INTO vid, vcod, vthe_geom;

  END LOOP;

	CLOSE cursor_teste;

  --------------------------------------------------------------------------------
  EXCEPTION
    When Others Then
      vMsgErro := 'ERRO NO PROCESSAMENTO DA PROCEDURE: ' ||
        To_Char(SqlCode) || ' - ' || SqlErrm;
      Rollback;
    RAISE_APPLICATION_ERROR (-1001, vMsgErro);
  --------------------------------------------------------------------------------

END ;
/
Obrigado pela força :)
Bassetto
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 3
Registrado em: Ter, 14 Nov 2006 2:04 pm
Localização: São Paulo - Bauru - Avaré

Tenta fazer um teste adicionando o exception when others then para ver se não está entrando em outro tipo de exceção.
Responder
  • Informação
  • Quem está online

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