- Este tópico contém 3 respostas, 3 vozes e foi atualizado pela última vez 16 anos, 7 meses atrás por leo_carvalho.
-
AutorPosts
-
17 de junho de 2008 às 12:10 am #82022leo_carvalhoParticipante
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;
17 de junho de 2008 às 12:22 am #82024Anônimotenta 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;17 de junho de 2008 às 12:27 am #82025Marcio68AlmeidaParticipanteBom…
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.17 de junho de 2008 às 12:41 am #82026leo_carvalhoParticipanteVLW vdrago, SUA RESPOSTA RESOLVEU O PROBLEMA.
OBRIGADO.
-
AutorPosts
- Você deve fazer login para responder a este tópico.