Segue abaixo os scripts para criação de 3 functions no ORACLE para validação de número CNS (Cartão Nacional de Saúde) definitivo e provisório a saber:
1. FCN_CNS_CHECAR_DEFINITIVO;
2. FCN_CNS_CHECAR_PROVISORIO;
3. FCN_CNS_CHECAR;
O único detalhe é que a function "FCN_CNS_CHECAR" deve ser criada por último, já que ela faz referência as outras duas functions.
create or replace function FCN_CNS_CHECAR_DEFINITIVO(P_NUM_CNS IN VARCHAR2)
return boolean is
/*******************************************************************************/
/* Objetivo.........: Checa se o número CNS definitivo é válido */
/* Autor............: Flavio Barbosa */
/* Parametros.......: P_NUM_CNS = Número do CNS a ser validado */
/* Retorno..........: True (1), se for válido; False (0), se for inválido */
/* Documento de Base: http://cartaonet.datasus.gov.br/downloadsNovo.asp */
/* Visite também....: http://www.ciaware.com.br */
v_num_cns varchar2(16) := '';
pis varchar2(16) := '';
resto integer := 0;
dv integer := 0;
soma number := 0;
resultado varchar2(16) := '';
result boolean := true;
begin
v_num_cns := trim(P_num_cns);
if ( length( v_num_cns )=15) then
pis := substr( V_NUM_CNS,1,11);
soma:= ( ( to_number( substr( pis, 1, 1 ) ) ) * 15 ) +
( ( to_number( substr( pis, 2, 1 ) ) ) * 14 ) +
( ( to_number( substr( pis, 3, 1 ) ) ) * 13 ) +
( ( to_number( substr( pis, 4, 1 ) ) ) * 12 ) +
( ( to_number( substr( pis, 5, 1 ) ) ) * 11 ) +
( ( to_number( substr( pis, 6, 1 ) ) ) * 10 ) +
( ( to_number( substr( pis, 7, 1 ) ) ) * 9 ) +
( ( to_number( substr( pis, 8, 1 ) ) ) * 8 ) +
( ( to_number( substr( pis, 9, 1 ) ) ) * 7 ) +
( ( to_number( substr( pis, 10, 1 ) ) ) * 6 ) +
( ( to_number( substr( pis, 11, 1 ) ) ) * 5 );
resto:= soma mod 11;
dv := 11 - resto;
if dv = 11 then
dv:= 0;
end if;
if dv = 10 then
soma:= ( ( to_number( substr( pis, 1, 1 ) ) ) * 15 ) +
( ( to_number( substr( pis, 2, 1 ) ) ) * 14 ) +
( ( to_number( substr( pis, 3, 1 ) ) ) * 13 ) +
( ( to_number( substr( pis, 4, 1 ) ) ) * 12 ) +
( ( to_number( substr( pis, 5, 1 ) ) ) * 11 ) +
( ( to_number( substr( pis, 6, 1 ) ) ) * 10 ) +
( ( to_number( substr( pis, 7, 1 ) ) ) * 9 ) +
( ( to_number( substr( pis, 8, 1 ) ) ) * 8 ) +
( ( to_number( substr( pis, 9, 1 ) ) ) * 7 ) +
( ( to_number( substr( pis, 10, 1 ) ) ) * 6 ) +
( ( to_number( substr( pis, 11, 1 ) ) ) * 5 ) + 2;
resto:= soma mod 11;
dv := 11 - resto;
resultado:= pis || '001' || to_char( dv );
else
resultado:= pis || '000' || to_char( dv );
end if;
result := (V_NUM_CNS = resultado);
end if;
return(Result);
end FCN_CNS_CHECAR_DEFINITIVO;
/
return boolean is
/*******************************************************************************/
/* Objetivo.........: Checa se o número CNS provisório é válido */
/* Autor............: Flavio Barbosa */
/* Parametros.......: P_NUM_CNS = Número do CNS a ser validado */
/* Retorno..........: True (1), se for válido; False (0), se for inválido */
/* Documento de Base: http://cartaonet.datasus.gov.br/downloadsNovo.asp */
/* Visite também....: http://www.ciaware.com.br */
/*******************************************************************************/
v_num_cns varchar2(16) := '';
resto integer := 0;
soma number := 0;
result boolean := false;
begin
v_num_cns := trim(P_num_cns);
if ( length( v_num_cns )=15) then
soma:= ( ( to_number( substr( V_NUM_CNS, 1, 1 ) ) ) * 15 ) +
( ( to_number( substr( V_NUM_CNS, 2, 1 ) ) ) * 14 ) +
( ( to_number( substr( V_NUM_CNS, 3, 1 ) ) ) * 13 ) +
( ( to_number( substr( V_NUM_CNS, 4, 1 ) ) ) * 12 ) +
( ( to_number( substr( V_NUM_CNS, 5, 1 ) ) ) * 11 ) +
( ( to_number( substr( V_NUM_CNS, 6, 1 ) ) ) * 10 ) +
( ( to_number( substr( V_NUM_CNS, 7, 1 ) ) ) * 9 ) +
( ( to_number( substr( V_NUM_CNS, 8, 1 ) ) ) * 8 ) +
( ( to_number( substr( V_NUM_CNS, 9, 1 ) ) ) * 7 ) +
( ( to_number( substr( V_NUM_CNS, 10, 1 ) ) ) * 6 ) +
( ( to_number( substr( V_NUM_CNS, 11, 1 ) ) ) * 5 ) +
( ( to_number( substr( V_NUM_CNS, 12, 1 ) ) ) * 4 ) +
( ( to_number( substr( V_NUM_CNS, 13, 1 ) ) ) * 3 ) +
( ( to_number( substr( V_NUM_CNS, 14, 1 ) ) ) * 2 ) +
( ( to_number( substr( V_NUM_CNS, 15, 1 ) ) ) * 1 );
resto:= soma mod 11;
result := (resto=0);
end if;
return(Result);
end FCN_CNS_CHECAR_PROVISORIO;
/
CREATE OR REPLACE FUNCTION FCN_CNS_CHECAR (V_Num_Cns in Varchar2)
Return Boolean
/*******************************************************************************/
/* Objetivo.......: Checa se o n. CNS é definitivo ou provisório e se é válido */
/* Autor..........: Flavio Barbosa */
/* Parametros.....: P_NUM_CNS = Número do CNS a ser validado */
/* Retorno........: True (1), se for válido; False (0), se for inválido */
/* Documento Base.: http://cartaonet.datasus.gov.br/downloadsNovo.asp */
/* Visite também..: http://www.ciaware.com.br */ /*******************************************************************************/
As
Soma number;
Result boolean := false;
Begin
If ((Trim(V_Num_Cns) Is Not Null) And (Length(Trim(V_Num_Cns)) = 15)) Then
IF (SUBSTR( TRIM(V_NUM_CNS), 1, 1) IN ( '8', '9' )) THEN
Result := FCN_CNS_CHECAR_PROVISORIO( V_NUM_CNS );
ELSE
Result := FCN_CNS_CHECAR_DEFINITIVO( V_NUM_CNS );
END IF;
End If;
Return( Result );
Exception When Others
Then Return (False);
End FCN_CNS_CHECAR;
/
Ola Flavio tentei utilizar sua rotina para usuário definitivo... ela esta com erro... voce tem alguma versão mais nova
ResponderExcluirEx.: este CNS = 704806065989444 ela retorna como invalido ... mas ele é valido.