Como chamar uma função que retorna BOOLEAN

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
leandrolco
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 31 Mai 2007 1:48 pm
Localização: Brasília-DF

Desenvolvi uma função que valida CPF, na primeira versão ela retornava char.
Se o CPF estáva correto retornava 'S', e se encontra-se algum erro retornava 'N', para chamar essa função, eu executava o seguinte select.

Selecionar tudo

SELECT validaCPF(00011188822) FROM DUAL;
sendo que o nome validaCPF é o nome da função.

O problema é que tive que mudar função pra retornar BOOLEAN, e não consigo elaborar o Select para chamar essa função

Pelo muito que pesquisei, pensei em usar o DECODE. Mas não consigo estruturar o select com ele e a função
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Você tem que testar esta condição, com IF, por exemplo:

Selecionar tudo


  IF FUN_RETORNA_BOOLEAN(10) 
  THEN 
      DBMS_OUTPUT.PUT_LINE('VERDADEIRO');
  ELSE 
      DBMS_OUTPUT.PUT_LINE('FALSO');
  END IF;

Dica: Não tem como você montar um bloco PL/SQL e tratar esta situação? Você poderia colocar o select em um loop, e realizar essa tratativa.

Qualquer coisa, manda ai.
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

Existe uma função que converte BOOLEAN para numérico.
http://glufke.net/oracle/viewtopic.php?p=1738

Infelizmente, não dá pra usar direto num SQL.
Mesmo assim, eu acho que você pode facilmente criar uma função que faça esse serviço.
edfimasa
Rank: Estagiário Pleno
Rank: Estagiário Pleno
Mensagens: 4
Registrado em: Qui, 02 Ago 2007 7:14 am
Localização: Porto

partindo do principio que afunção está bem construida podes usar a função DECODE no select.

Selecionar tudo

Select DECODE(funcao,'true',fazalgo,'false',fazoutracoisa)  
o DECODE funciona como um IF-ELSE.

Se não funcionar com pelicas, tira as pelicas.
leandrolco
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 31 Mai 2007 1:48 pm
Localização: Brasília-DF

Selecionar tudo

create or replace
FUNCTION "CPF_VALIDO" (CPF VARCHAR2) 
        RETURN BOOLEAN
        IS
                SOMA           NUMBER;
                DIG1           NUMBER;
                DIG2           NUMBER;
                DIGITOS_IGUAIS VARCHAR2(1);
                RESULTADO      BOOLEAN;
        BEGIN
                RESULTADO      := FALSE;
                DIGITOS_IGUAIS := 'S';
                /*
                Verificando se os digitos são iguais
                A Principio CPF com todos o números iguais são Inválidos
                apesar de validar o Calculo do digito verificado
                EX: O CPF 00000000000 é inválido, mas pelo calculo
                Validaria
                */
                IF (CPF = '00000000000') OR (CPF = '11111111111') OR 
                   (CPF = '22222222222') OR (CPF = '33333333333') OR 
                   (CPF = '44444444444') OR (CPF = '55555555555') OR 
                   (CPF = '66666666666') OR (CPF = '77777777777') OR 
                   (CPF = '88888888888') OR (CPF = '99999999999') THEN
                        DIGITOS_IGUAIS := 'S';
                ELSE
                        DIGITOS_IGUAIS := 'N';
                END IF;
                --Caso os digitos não sejão todos iguais Começo o calculo do digitos
                IF DIGITOS_IGUAIS = 'N' THEN
                        --Cálculo do 1º dígito
                        SOMA          := 0;
                        FOR i IN 1 .. 9
                        LOOP
                            SOMA   := SOMA   + SUBSTR(CPF,i,1) * (11 - i);                         
                        END LOOP;
                        DIG1         := 11 - MOD (SOMA, 11);
                        IF DIG1 > 9 THEN
                           DIG1 := 0;
                        END IF;
                        
                        -- Cálculo do 2º dígito }
                        SOMA          := 0;
                        FOR i IN 1 .. 10
                        LOOP
                            SOMA   := SOMA   + SUBSTR(CPF,i,1) * (12 - i);
                        END LOOP;
                        DIG2         := 11 - MOD (SOMA, 11);
                        IF DIG2  > 9 THEN
                           DIG2 := 0;
                        END IF;
                
                        -- Validando
                        IF (DIG1 = SUBSTR(CPF,10,1)) AND (DIG2 = SUBSTR(CPF,11,1)) THEN
                                RESULTADO := TRUE;
                        ELSE
                                RESULTADO := FALSE;
                        END IF;
                ELSE
                        RESULTADO := FALSE;
                END IF;
                RETURN RESULTADO;
        END;
Tentei usar o DECODE mas me retornou um erro

Selecionar tudo

SELECT DECODE(CPF_VALIDO('00000000000'),TRUE,1,FALSE,0) 
FROM DUAL;

An error was encountered perfoming the requested operation:
ORA-00904: nome inválido de coluna
00904. 00000 - "%s: invalid identifier"
*Cause:
*Action:
Error at line:1 Column:47
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother,

Eu particularmente acho q não terá como, ao menos desta forma com SELECT.
Não tem como colocar num loop e tratar(via PL/SQL)?
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

Ou faz como eu disse:
Cria uma função que recebe BOOLEAN e retorna numérico.
Daí você pode usar ela onde quiser. (sem afetar as functions)
Renan Orati
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 90
Registrado em: Qui, 23 Ago 2007 3:40 pm
Localização: São José do Rio Preto - SP

e no caso você não pode alterar o resultado da sua função???
ao invés de retornar boolean retornar number??? ex:

Selecionar tudo

create or replace 
FUNCTION FUNC_CPF_VALIDO(CPF VARCHAR2) 
        RETURN NUMBER 
        IS 
                SOMA           NUMBER; 
                DIG1           NUMBER; 
                DIG2           NUMBER; 
                DIGITOS_IGUAIS VARCHAR2(1); 
                RESULTADO      NUMBER(1); 
        BEGIN 
                RESULTADO      := 0; 
                DIGITOS_IGUAIS := 'S'; 
                /* 
                Verificando se os digitos são iguais 
                A Principio CPF com todos o números iguais são Inválidos 
                apesar de validar o Calculo do digito verificado 
                EX: O CPF 00000000000 é inválido, mas pelo calculo 
                Validaria 
                */ 
                IF (CPF = '00000000000') OR (CPF = '11111111111') OR 
                   (CPF = '22222222222') OR (CPF = '33333333333') OR 
                   (CPF = '44444444444') OR (CPF = '55555555555') OR 
                   (CPF = '66666666666') OR (CPF = '77777777777') OR 
                   (CPF = '88888888888') OR (CPF = '99999999999') THEN 
                        DIGITOS_IGUAIS := 'S'; 
                ELSE 
                        DIGITOS_IGUAIS := 'N'; 
                END IF; 
                --Caso os digitos não sejão todos iguais Começo o calculo do digitos 
                IF DIGITOS_IGUAIS = 'N' THEN 
                        --Cálculo do 1º dígito 
                        SOMA          := 0; 
                        FOR i IN 1 .. 9 
                        LOOP 
                            SOMA   := SOMA   + SUBSTR(CPF,i,1) * (11 - i);                          
                        END LOOP; 
                        DIG1         := 11 - MOD (SOMA, 11); 
                        IF DIG1 > 9 THEN 
                           DIG1 := 0; 
                        END IF; 
                        
                        -- Cálculo do 2º dígito } 
                        SOMA          := 0; 
                        FOR i IN 1 .. 10 
                        LOOP 
                            SOMA   := SOMA   + SUBSTR(CPF,i,1) * (12 - i); 
                        END LOOP; 
                        DIG2         := 11 - MOD (SOMA, 11); 
                        IF DIG2  > 9 THEN 
                           DIG2 := 0; 
                        END IF; 
                
                        -- Validando 
                        IF (DIG1 = SUBSTR(CPF,10,1)) AND (DIG2 = SUBSTR(CPF,11,1)) THEN 
                                RESULTADO := 1; 
                        ELSE 
                                RESULTADO := 0; 
                        END IF; 
                ELSE 
                        RESULTADO := 0; 
                END IF; 
                RETURN RESULTADO; 
        END;
leandrolco
Rank: Estagiário Sênior
Rank: Estagiário Sênior
Mensagens: 9
Registrado em: Qui, 31 Mai 2007 1:48 pm
Localização: Brasília-DF

Me permitirão, que a função retorne char, ou seja 'S' ou 'N'

Mas agora estou com o problema, o campo CPF da tabela é varchar sendo assim na migração alguns numeros se tornaram letras, assim quando o a função é chamada e o CPF tem alguma caracter diferente de numero me retorna um erro, como faço de uma forma mais simples, pois a que criei fica enorme, que é com uma condição e varios 'ou'

Selecionar tudo

IF (CPF = a) OR (CPF = b)
e assim até Z
O problema que a versão do oracle é a 9i e so apartir da 10g que foi criado o RegExp
Trevisolli
Moderador
Moderador
Mensagens: 2016
Registrado em: Qua, 12 Jan 2005 3:25 pm
Localização: Araraquara - SP
Abraço,

Trevisolli
OCA Oracle PL/SQL Developer Certified Associate
OCP Oracle Forms Developer Certified Professional
Araraquara-SP

Brother, beleza?

Então, procure aqui no fórum pela função TRANSLATE.
Creio que o ajude.

Segue um exemplo:

Selecionar tudo

SELECT TRANSLATE('123456', -- Campo da tabela 
                 '123456',  
                 'ABCDE7') FROM DUAL;
Acho q isso diminui um pouco tua programação.
tchuck
Rank: Analista Júnior
Rank: Analista Júnior
Mensagens: 70
Registrado em: Seg, 04 Dez 2006 9:22 am
Localização: Maringá

Brother
tenta da seguinte maneira

Selecionar tudo

select decode(validaCPF('NUMEROCPF'),'TRUE','S','N') FROM DUAL
Isso deve funcionar
Se você quer 'SIM' OU 'não' deve funcionar.
Responder
  • Informação
  • Quem está online

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