用SQL来校验证件号码是否合法

2023-05-16

--正确时返回证件号,错误时返回错误原因

select  t.centno,xingming,ZJHM,FUNC_AAC002_15_18(ZJHM) from TABLEt 
where ZJHM<>FUNC_AAC002_15_18(ZJHM); 

--oracle校验身份证号
CREATE OR REPLACE FUNCTION FUNC_AAC002_15_18 (prm_aac002 varchar2)
  return varchar2 is
  ll_i       number(4) := 18;
  ll_row     number(5) := 0;
  var_aac002 varchar2(18);
  ll_sfz18   number(3);
  ll_sfz     varchar2(3);
  var_sfz18  varchar(18);
  var_date   varchar(10);
  dat_date   date;
  ll_num     number(2);
  s_sfz      varchar2(15);
  s_sss      varchar2(20):='X';
  v_newaac002 varchar(20);
  n_length number(2);
  V_CHAR varchar2(15);
  s_date varchar2(15);
begin
  if prm_aac002 is null then
    return '';
  end if;
  if length(prm_aac002) <> 15 and length(prm_aac002) <> 18 then
    return '';
  end if;
  if length(prm_aac002) = 18 then
    n_length := length(prm_aac002);
      FOR n_i IN 1 .. n_length LOOP
          V_CHAR := SUBSTR(prm_aac002, n_i, 1);
          IF V_CHAR IN ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9') AND N_I<18 THEN
             v_newaac002 :=prm_aac002;
          ELSIF N_I=18 AND V_CHAR IN('0', '1', '2', '3', '4', '5', '6', '7', '8', '9','X') THEN
             v_newaac002 :=prm_aac002;
          else
             return  '含义非法字符!';
          END IF;
       END LOOP;
       /*2. 取出生日期是否有效*/
       s_date := substr(prm_aac002, 7, 8);
        begin
          select to_date(s_date, 'yyyymmdd') into dat_date from dual;
        exception
          when others then
            return '出生日期不对!';
        end;
       if substr(prm_aac002,7, 2)>20 or substr(prm_aac002,7, 2) <19 then
          return '年度不对!';
       end if;
        /*3. 最后位效验*/
        while n_length >= 2 loop
            begin
              select to_number(substr(prm_aac002, 19 - n_length, 1))
                into ll_num
                from dual;
            exception
              when others then
                return '';
            end;
            ll_row := ll_row + mod(power(2, (n_length - 1)), 11) *
                      to_number(substr(prm_aac002, 19 - n_length, 1));
            n_length   := n_length - 1;
          end loop;
          ll_sfz18 := mod(ll_row, 11);
          select decode(to_char(ll_sfz18),'0','1','1','0','2','X','3','9','4','8','5','7','6','6','7','5','8','4','9','3','10','2')
            into ll_sfz
            from dual;
          if ll_sfz <> substr(prm_aac002,18, 1) then
             return '尾数不对!应为'||ll_sfz;
          end if;
           RETURN v_newaac002;
  end if;
  if prm_aac002 = '111111111111111111' then
     return '';
  end if;
  if s_sfz <>'X' then
     s_sss := s_sfz;
  else
     s_sss := prm_aac002;
  end if;
if length(prm_aac002)=15 then
  var_date := '19' || substr(s_sss, 7, 6);
  begin
    select to_date(var_date, 'yyyymmdd') into dat_date from dual;
  exception
    when others then
      return '';
  end;
  var_aac002 := substr(s_sss, 0, 6) || '19' ||
                substr(s_sss, 7, 9);
  while ll_i >= 2 loop
    begin
      select to_number(substr(var_aac002, 19 - ll_i, 1))
        into ll_num
        from dual;
    exception
      when others then
        return '';
    end;
    ll_row := ll_row + mod(power(2, (ll_i - 1)), 11) *
              to_number(substr(var_aac002, 19 - ll_i, 1));
    ll_i   := ll_i - 1;
  end loop;
  ll_sfz18 := mod(ll_row, 11);
  select decode(to_char(ll_sfz18),'0','1','1','0','2','X','3','9','4','8','5','7','6','6','7','5','8','4','9','3','10','2')
    into ll_sfz
    from dual;
  var_sfz18 := var_aac002 || ll_sfz;
  return var_sfz18;
  end if;
end FUNC_AAC002_15_18;



 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

用SQL来校验证件号码是否合法 的相关文章

  • Postgresql 和 jsonb - 将键/值插入多级数组

    非常类似于这个帖子 https stackoverflow com questions 58959678 postgresql add key to each objects of an jsonb array 但我很难适应他们的解决方案
  • SQL 语法检查器和验证器? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有类似 SQL 的 lint 语法检查器和验证器 之类的东西 有一个项目 SQLLint 检测 S
  • 分组依据检索 3 个值

    我有以下查询 SELECT Cod MIN Id AS id Min MAX Id AS id Max retrieve value in the middle COUNT AS Tot FROM Table a NOLOCK GROUP
  • 在 AppEngine 项目之外使用 Google AppEngine 数据存储区

    对于我的小框架Pyxer http code google com p pyxer 我希望能够在 AppEngine 项目之外使用 Google AppEngine 数据存储 因为我现在已经习惯了这种 ORM 模式 对于一些快速的黑客来说
  • MySQL 中有“connect by”替代方案吗?

    如果我使用 Oracle 有connect by可用于创建分层查询的关键字 目前我正在一个项目中使用MySQL 我想知道是否有替代方案connect by在 MySQL 中 我尝试过谷歌 但到目前为止还没有结果 我想要实现的是通过一个查询从
  • 转置和聚合 Oracle 列数据

    我有以下数据 Base End RMSA Item 1 RMSA Item 2 RMSA Item 3 RMSB Item 1 RMSB Item 2 RMSC Item 4 我想将其转换为以下格式 Key Products RMSA RM
  • 如何在 SQL 中选择“上一条”和“下一条”记录?

    I am building a blog post detail page on my site that will display display a previous and next link similar to how a typ
  • Postgres 上的 C 语言环境和 Posix 语言环境有什么区别?

    我知道 Postgres 上的数据库区域设置负责国家字符的正确顺序 正确的小写 大写等 但为什么有两种语言中立的语言环境 posix and c 它们之间有什么区别 还是只是一个中立的语言环境有两个不同的名称 UPDATE正如 Magnus
  • 使用sqlbulkcopy之前如何创建表

    我有一个 DBF 文件 我正在尝试导入该文件 然后将其写入 SQL 表 我遇到的问题是 如果我使用 SqlBulkCopy 它需要我提前创建表 但在我的场景中这是不可能的 因为 dbf 文件不断变化 到目前为止 这是我的代码 public
  • ADO.NET 池连接无法重用

    我正在开发一个 ASP NET MVC 应用程序 该应用程序使用 EF 6 x 来处理我的 Azure SDL 数据库 最近 随着负载的增加 应用程序开始进入无法再与 SQL 服务器通信的状态 我可以看到有 100 个到我的数据库的活动连接
  • 金融 - 计算到期收益率

    我读了this https stackoverflow com questions 1173555 open source financial library specifically yield to maturity发布关于 net 库
  • sql查询中case语句中的布尔值

    我在选择查询中使用 case 语句 类似这样 Select col1 col2 isActive case when col3 abc then 1 else 0 end col4 from
  • 法语和西班牙语的特殊字符可以保存在 varchar 中吗?

    法语和西班牙语中有普通英语中不使用的特殊字符 重音元音等 varchar 是否支持这些字符 或者我需要一个 nvarchar 吗 注 我愿意NOT希望讨论我是否应该使用 nvarchar 还是 varchar 您在谈论什么 SQL 实现 我
  • 如何在oracle中获取表作为输出参数

    我正在尝试将 Oracle 过程调用的 out 参数强制转换为对象 它不起作用 因为 据我了解 我需要定义一个映射 它告诉方法如何转换它 如果地图为空或未正确填充 则它默认为 STRUCT 类型的对象 在我的情况下这是错误的 我已经构建了一
  • SQL Like 带有子查询

    我怎样才能做到这一点 SELECT FROM item WHERE item name LIKE SELECT equipment type FROM equipment type GROUP BY equipment type 内部子查询
  • 过滤项目来源

    通过此代码 我设置了数据网格的 ItemsSource 不过 我有更多的 wpf 控件来过滤数据网格 例如从时间范围过滤数据网格 我可以为此编写一个新查询 但这似乎没有必要 因为数据已经可用 我只需要过滤它 最好的方法是什么 我能得到的任何
  • SQL 查询结果为字符串(或变量)

    是否可以将SQL查询结果输出到一个字符串或变量中 我的php和mysql不好 假设我有数据库 agents 其中包含列 agent id agent fname agent lname agent dept 使用此查询 sql SELECT
  • 如何将此本机 SQL 查询转换为 HQL

    所以我有这个很长的复杂的 Native SQLQuery string hql SELECT FROM SELECT a rownum r FROM select f2 filmid f2 realisateurid f2 titre f2
  • Solr 增量导入不起作用

    我使用的是solr 4 2 请注意 完全导入有效 但增量导入却无效 增量导入不会给出任何错误 但不会获取任何更改 这是数据配置文件
  • SQL Server 标识列值从 0 而不是 1 开始

    我遇到了一个奇怪的情况 数据库中的某些表的 ID 从 0 开始 即使 TABLE CREATE 的 IDENTITY 1 1 也是如此 对于某些表来说是这样 但对于其他表则不然 它一直有效到今天 我尝试过重置身份列 DBCC CHECKID

随机推荐

  • 19.Win10安装Linux(Ubuntu 20.04)双系统

    Win10安装Linux xff08 Ubuntu 20 04 xff09 双系统 1 电脑配置2 下载Ubuntu 系统镜像2 1官网地址2 2 阿里2 3 清华源 3 制作U盘启动盘3 1 UltraISO 下载地址3 2 Etcher
  • 22.Ubuntu出现“由于没有公钥,无法验证下列签名”

    由于没有公钥 xff0c 无法验证下列签名 1 无公钥错误2 输入命令导入公钥3 注意 1 无公钥错误 使用sudo apt update时出现以下错误 xff1a 我图中的公钥就是 xff1a 3B4FE6ACC0B21F32 xff08
  • 15. Java字符串操作(StringJoiner)

    字符串操作 xff08 StringJoiner xff09 1 StringJoiner2 在字符串拼接中体验下StringJoiner 3 StringJoiner构造方法4 StringJoiner成员方法5 练习6 总结 1 Str
  • 39.Java-interface接口

    interface接口 1 interface2 接口的定义和使用3 接口中成员的特点4 接口和类之间的关系5 实例6 接口中新增的方法6 1 JDK8以后新增2种方法6 1 1 允许在接口中定义默认方法6 1 2 允许在接口中定义静态方法
  • 修改工单号码的流水号

    The job number is defined by sequence WIP JOB NUMBER S in the database The WIP numbering also uses the prefix defined in
  • 40.java-单列集合Set(HashSet,LinkedHashSet,TreeSet)

    Set集合 1 Set集合特点2 Set集合实现类3 HashSet3 1 底层原理3 1 1 哈希表组成3 1 2 哈希值3 1 3 对象的哈希值特点 3 2 数据添加元素的过程3 3 HashSet的三个问题3 4 实例 xff1a 去
  • 41.Java单列集合LinkedList

    单列集合LinkedList 1 LinkedList集合2 源码3 ArrayList和LinkedList的区别 1 LinkedList集合 在许多情况下 xff0c ArrayList效率更高 xff0c 因为通常需要访问列表中的某
  • hiveh和presto中date_add

    日期增加函数 date add语法 hive gt select date add 2016 12 29 10 presto gt select date add day 1 TIMESTAMP 2014 03 08 09 00 00 ht
  • synchronized关键字

    https tech meituan com 2018 11 15 java lock html https juejin im post 5ae6dc04f265da0ba351d3ff https leejay top posts Sy
  • CAS

    一 CAS简介 比较并交换 compare and swap CAS xff0c 是原子操作的一种 xff0c 可用于在多线程编程中实现不被打断的数据交换操作 xff0c 从而避免多线程同时改写某一数据时由于执行顺序不确定性以及中断的不可预
  • 帧内预测

    转载于 xff1a https www cnblogs com charybdis p 6049108 html 为什么要有帧内预测 xff1f 因为一般来说 xff0c 对于一幅图像 xff0c 相邻的两个像素的亮度和色度值之间经常是比较
  • 找出数组中没有出现的最小正整数

    题目描述 xff1a 给定一个无序整型数组arr 找到数组中未出现的最小整数 例子 arr 61 1 2 3 4 return 1 arr 61 1 2 3 4 return 5 时间复杂度O n 空间复杂度O 1 解题思路 xff1a x
  • 公有云弹性IP的实现原理及优势

    原文链接 xff1a http news west cn 26218 html 在利用公有云服务部署我们的应用时 xff0c 为了访问到我们的服务器 xff0c 我们需要为我们的服务部署公网IP 公有云服务商除了可以为服务器提供固定的公网I
  • vim 怎么取消高亮 或取消选中状态

    原文链接 xff1a https blog csdn net weixin 40539892 article details 78946659 神操作 在vim中编写代码 xff0c 常常会遇到多行注释和取消注释的情况 xff0c 在VS中
  • 工单关联销售订单

    CREATE OR REPLACE TRIGGER CUX WIP DISCRETE JOBS BEFORE INSERT ON INV MTL RESERVATIONS FOR EACH ROW when NEW SUPPLY SOURC
  • P2P(Peer to Peer)对等网络

    P2P xff08 Peer to Peer xff09 对等网络 P2P技术属于覆盖层网络 Overlay Network 的范畴 xff0c 是相对于客户机 服务器 C S 模式来说的一种网络信息交换方式 在C S模式中 xff0c 数
  • JAVA四大域对象总结

    JAVA四大域对象总结 根据有作用范围由小到大 xff1a page 当前jsp页面 page域指的是pageContext request 一次请求 request域request HttpServletContext session 一
  • Java中如何判断两个对象是否相等

    如何判断两个对象相等 xff0c 这个问题实际上可以看做是如何对equals方法和hashcode方法的理解 从以下几个点来理解equals和hashCode方法 xff1a 1 equals的作用及与 61 61 的区别 2 hashco
  • nginx中的日志管理

    我们观察nginx的server段 可以看到如下类似信息 access log logs host access log main 这说明 该server 它的访问日志的文件是 logs host access log 使用的格式 main
  • 用SQL来校验证件号码是否合法

    正确时返回证件号 xff0c 错误时返回错误原因 select t centno xingming ZJHM FUNC AAC002 15 18 ZJHM from TABLEt where ZJHM lt gt FUNC AAC002 1