Pular para o conteúdo
  • Este tópico contém 3 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 7 meses atrás por leo_carvalho.
Visualizando 4 posts - 1 até 4 (de 4 do total)
  • Autor
    Posts
  • #82022
    leo_carvalho
    Participante

      ESTOU CRIANDO A FUNÇÃO ABAIXO, PORÉM QUANDO O PRIMEIRO SQL ( –Verifica se a conta é uma conta pai ) NÃO RETORNA VALOR (A RESPOSTA E NULL), A FUNÇÃO CAI NA EXCEÇÃO E EU NÃO CONSEGUI DESCOBRIR O QUE É, ALGUÉM CONSEGUE ME AJUDAR?

      CREATE OR REPLACE FUNCTION PROD.FN_RET_BANDA_POR_CONTA(p_conta NUMBER) RETURN STRING IS v_banda VARCHAR2(02);

      v_contador_banda_A INTEGER := 0;
      v_contador_banda_E INTEGER := 0;
      v_verifica_conta_pai INTEGER := 0;
      v_num_conta_raiz INTEGER := 0;

      BEGIN

      –Verifica se a conta é uma conta pai
      SELECT C.NUM_CONTA_RAIZ, COUNT(*)
      INTO V_NUM_CONTA_RAIZ, V_VERIFICA_CONTA_PAI
      FROM PROD.TBDWDD_CONTA C
      WHERE C.NUM_NIVEL_CONTA in (10, 20, 30)
      AND C.NUM_CONTA = p_conta
      GROUP BY C.NUM_CONTA_RAIZ;

      IF v_verifica_conta_pai > 0 THEN
      — É uma conta pai
      FOR cursor_banda IN(
      SELECT distinct decode(PL.COD_POLO_LOCALIDADE, 28, ‘E’, -1, ‘-1’, -2, ‘-2’, ‘A’) banda
      FROM prod.VWDWDD_CONTRATO C,
      prod.TBDWDD_LOCALIDADE L,
      prod.TBDWDD_POLO_LOCALIDADE PL,
      prod.tbdwdd_conta co
      WHERE Co.Num_Conta_Raiz = v_num_conta_raiz
      AND C.COD_LOCALIDADE_ACESSO = L.COD_LOCALIDADE
      AND L.COD_POLO_LOCALIDADE = PL.COD_POLO_LOCALIDADE
      AND c.num_conta = co.num_conta

      ) LOOP

      IF cursor_banda.banda = ‘E’ THEN
      v_contador_banda_E := v_contador_banda_E + 1;
      ELSIF cursor_banda.banda = ‘A’ THEN
      v_contador_banda_A := v_contador_banda_A + 1;
      END IF;

      END LOOP;
      ELSE
      –Não é uma conta pai
      IF NOT(p_conta IN (-1, -2)) THEN
      FOR cursor_banda_filho IN(
      SELECT decode(PL.COD_POLO_LOCALIDADE, 28, ‘E’, -1, ‘-1’, -2, ‘-2’, ‘A’) banda
      FROM prod.VWDWDD_CONTRATO C,
      prod.TBDWDD_LOCALIDADE L,
      prod.TBDWDD_POLO_LOCALIDADE PL
      WHERE C.NUM_CONTA = p_conta
      AND C.COD_LOCALIDADE_ACESSO = L.COD_LOCALIDADE
      AND L.COD_POLO_LOCALIDADE = PL.COD_POLO_LOCALIDADE

      )LOOP
      IF cursor_banda_filho.banda = ‘E’ THEN
      v_contador_banda_E := v_contador_banda_E + 1;
      ELSIF cursor_banda_filho.banda = ‘A’ THEN
      v_contador_banda_A := v_contador_banda_A + 1;
      END IF;
      END LOOP;
      END IF;

      END IF;

      IF v_contador_banda_A > 0 and v_contador_banda_E > 0 THEN
      v_banda := ‘AE’;
      ELSIF v_contador_banda_A = 0 and v_contador_banda_E = 0 THEN
      v_banda := ‘-1’;
      ELSIF v_contador_banda_A > 0 THEN
      v_banda := ‘A’;
      ELSIF v_contador_banda_E > 0 THEN
      v_banda := ‘E’;
      ELSE
      v_banda := NULL;
      END IF;

      IF p_conta = -1 THEN
      v_banda := ‘-1’;
      ELSIF p_conta = -2 THEN
      v_banda := ‘-2’;
      END IF;

      RETURN v_banda;

      EXCEPTION
      WHEN others THEN
      RETURN ‘erro final’ ;

      END FN_RET_BANDA_POR_CONTA;

      #82024
      Anônimo

        tenta dessa forma :

        begin — pode abrir outro begin sem problema
        SELECT C.NUM_CONTA_RAIZ, COUNT(*)
        INTO V_NUM_CONTA_RAIZ, V_VERIFICA_CONTA_PAI
        FROM PROD.TBDWDD_CONTA C
        WHERE C.NUM_NIVEL_CONTA in (10, 20, 30)
        AND C.NUM_CONTA = p_conta
        GROUP BY C.NUM_CONTA_RAIZ;
        exception — essa exception é só desse bloco…
        when NO_DATA_FOUND then
        v_verifica_conta_pai := 0 ;
        end;

        #82025
        Marcio68Almeida
        Participante

          Bom…
          Qualquer falha que ocorra entre o Begin e Exception vai para o exception e será tratado lá.
          O ideal é que você quebre o seu processo em vários pequenos passos e trate cada um individualmetne, é o prinícpio do OO (Orientado a Objeto)
          Faça funções intercambiáveis que poderão ser reaproveitadas em outras partes do sistema.
          Assim, mesmo que não tenha valor, você trata no exceptio e devolve algo que seja válido para o seu processo, não interrompendo, a menos que seja um erro propriamente dito e necessite interrupção.

          #82026
          leo_carvalho
          Participante

            VLW vdrago, SUA RESPOSTA RESOLVEU O PROBLEMA.

            OBRIGADO.

          Visualizando 4 posts - 1 até 4 (de 4 do total)
          • Você deve fazer login para responder a este tópico.
          plugins premium WordPress