Advertisement
Guest User

Untitled

a guest
Aug 21st, 2017
93
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
SQL 5.78 KB | None | 0 0
  1. --
  2. -- Esta função retorna true se o CPF é válido  e falso caso contrário
  3. -- Ela verifica o tamanho e os dígitos verificadores
  4. --
  5. CREATE OR REPLACE FUNCTION validar_cpf(text)
  6. RETURNS BOOLEAN AS $$
  7. -- se o tamanho for 11 prossiga com o cálculo
  8. -- senão retorne falso
  9. SELECT CASE WHEN LENGTH($1) = 11 THEN
  10. (
  11.   -- verifica se os dígitos coincidem com os especificados
  12.   SELECT
  13.       SUBSTR($1, 10, 1) = CAST(digit1 AS text) AND
  14.       SUBSTR($1, 11, 1) = CAST(digit2 AS text)
  15.   FROM
  16.   (
  17.     -- calcula o segundo dígito verificador (digit2)
  18.     SELECT
  19.         -- se o resultado do módulo for 0 ou 1 temos 0
  20.         -- senão temos a subtração de 11 pelo resultado do módulo
  21.         CASE res2
  22.         WHEN 0 THEN 0
  23.         WHEN 1 THEN 0
  24.         ELSE 11 - res2
  25.         END AS digit2,
  26.         digit1
  27.     FROM
  28.     (
  29.       -- soma da multiplicação dos primeiros 9 dígitos por 11, 10, ..., 4, 3
  30.       -- obtemos o módulo da soma por 11
  31.       SELECT
  32.           MOD(SUM(m * CAST(SUBSTR($1, 12 - m, 1) AS INTEGER)) + digit1 * 2, 11) AS res2,
  33.           digit1
  34.       FROM
  35.       generate_series(11, 3, -1) AS m,
  36.       (
  37.         -- calcula o primeiro dígito verificador (digit1)
  38.         SELECT
  39.             -- se o resultado do módulo for 0 ou 1 temos 0
  40.             -- senão temos a subtração de 11 pelo resultado do módulo
  41.             CASE res1
  42.             WHEN 0 THEN 0
  43.             WHEN 1 THEN 0
  44.             ELSE 11 - res1
  45.             END AS digit1
  46.         FROM
  47.         (
  48.           -- soma da multiplicação dos primeiros 9 dígitos por 10, 9, ..., 3, 2
  49.           -- obtemos o módulo da soma por 11
  50.           SELECT
  51.               MOD(SUM(n * CAST(SUBSTR($1, 11 - n, 1) AS INTEGER)), 11) AS res1
  52.           FROM generate_series(10, 2, -1) AS n
  53.         ) AS sum1
  54.       ) AS first_digit
  55.       GROUP BY digit1
  56.     ) AS sum2
  57.   ) AS first_sec_digit
  58. )
  59. ELSE FALSE END
  60. WHERE $1 !~ '[^0-9]';
  61.  
  62. $$ LANGUAGE SQL
  63. IMMUTABLE STRICT;
  64.  
  65. COMMENT ON FUNCTION validar_cpf(text) IS 'retorna verdadeiro se e, somente se, o CPF
  66. possui o tamanho correto (11 dígitos) e os dígitos calculados coincidem com os especificados';
  67.  
  68. ALTER FUNCTION validar_cpf(text) OWNER TO postgres;
  69.  
  70.  
  71. --
  72. -- Esta função retorna true se o CNPJ é válido  e falso caso contrário
  73. -- Ela verifica o tamanho e os dígitos verificadores
  74. --
  75. CREATE OR REPLACE FUNCTION validar_cnpj(text)
  76. RETURNS BOOLEAN AS $$
  77. -- se o tamanho for 14 prossiga com o cálculo
  78. -- senão retorne falso
  79. SELECT CASE WHEN LENGTH($1) = 14 THEN
  80. (
  81.   -- verifica se os dígitos coincidem com os especificados
  82.   SELECT
  83.       SUBSTR($1, 13, 1) = CAST(digit1 AS text) AND
  84.       SUBSTR($1, 14, 1) = CAST(digit2 AS text)
  85.   FROM
  86.   (
  87.     -- calcula o segundo dígito verificador (digit2)
  88.     SELECT
  89.         -- se o resultado do módulo for 0 ou 1 temos 0
  90.         -- senão temos a subtração de 11 pelo resultado do módulo
  91.         CASE res2
  92.         WHEN 0 THEN 0
  93.         WHEN 1 THEN 0
  94.         ELSE 11 - res2
  95.         END AS digit2,
  96.         digit1
  97.     FROM
  98.     (
  99.       -- soma da multiplicação dos primeiros 9 dígitos por 11, 10, ..., 4, 3
  100.       -- obtemos o módulo da soma por 11
  101.       SELECT MOD(SUM(res2) + digit1 * 2, 11) AS res2,
  102.           digit1
  103.       FROM
  104.       (
  105.         SELECT
  106.             SUM(m * CAST(SUBSTR($1, 7 - m, 1) AS INTEGER)) AS res2
  107.         FROM
  108.         (
  109.           SELECT generate_series(6, 2, -1) AS m
  110.         ) AS m11
  111.         UNION ALL
  112.         SELECT
  113.             SUM(m * CAST(SUBSTR($1, 15 - m, 1) AS INTEGER)) AS res2
  114.         FROM
  115.         (
  116.           SELECT generate_series(9, 3, -1) AS m
  117.         ) AS m12
  118.       ) AS m2,
  119.       (
  120.         -- calcula o primeiro dígito verificador (digit1)
  121.         SELECT
  122.             -- se o resultado do módulo for 0 ou 1 temos 0
  123.             -- senão temos a subtração de 11 pelo resultado do módulo
  124.             CASE res1
  125.             WHEN 0 THEN 0
  126.             WHEN 1 THEN 0
  127.             ELSE 11 - res1
  128.             END AS digit1
  129.         FROM
  130.         (
  131.           -- soma da multiplicação dos primeiros 12 dígitos por 5, 4, 3, 2, 9, 8, 7, ..., 3, 2
  132.           -- obtemos o módulo da soma por 11
  133.           SELECT MOD(SUM(res1), 11) AS res1
  134.           FROM
  135.           (
  136.             SELECT
  137.                 SUM(n * CAST(SUBSTR($1, 6 - n, 1) AS INTEGER)) AS res1
  138.             FROM
  139.             (
  140.               SELECT generate_series(5, 2, -1) AS n
  141.             ) AS m11
  142.             UNION ALL
  143.             SELECT
  144.                 SUM(n * CAST(SUBSTR($1, 14 - n, 1) AS INTEGER)) AS res1
  145.             FROM
  146.             (
  147.               SELECT generate_series(9, 2, -1) AS n
  148.             ) AS m12
  149.           ) AS m1
  150.         ) AS sum1
  151.       ) AS first_digit
  152.       GROUP BY digit1
  153.     ) AS sum2
  154.   ) AS first_sec_digit
  155. )
  156. ELSE FALSE END
  157. WHERE $1 !~ '[^0-9]';
  158.  
  159. $$ LANGUAGE SQL
  160. IMMUTABLE STRICT;
  161.  
  162. COMMENT ON FUNCTION validar_cnpj(text) IS 'retorna verdadeiro se e, somente se, o CNPJ
  163. possui o tamanho correto (14 dígitos) e os dígitos calculados coincidem com os especificados';
  164.  
  165. ALTER FUNCTION validar_cnpj(text) OWNER TO postgres;
  166.  
  167.  
  168. --
  169. -- Esta função retorna true se o CPF ou CNPJ é válido  e falso caso contrário
  170. -- Ela verifica o tamanho e os dígitos verificadores
  171. --
  172. CREATE OR REPLACE FUNCTION validar_cpfcnpj(text)
  173. RETURNS BOOLEAN AS $$
  174. -- se o tamanho for 11 ou 14 prossiga com o cálculo
  175. -- senão retorne falso
  176. SELECT CASE
  177.     WHEN LENGTH($1) = 11 THEN validar_cpf($1)
  178.     WHEN LENGTH($1) = 14 THEN validar_cnpj($1)
  179.     ELSE FALSE END
  180. WHERE $1 !~ '[^0-9]';
  181.  
  182. $$ LANGUAGE SQL
  183. IMMUTABLE STRICT;
  184.  
  185. COMMENT ON FUNCTION validar_cpfcnpj(text) IS 'retorna verdadeiro se e, somente se, o CPF ou CNPJ
  186. possui o tamanho correto (11 ou 14 dígitos) e os dígitos calculados coincidem com os especificados';
  187.  
  188. ALTER FUNCTION validar_cpfcnpj(text) OWNER TO postgres;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement