CREATE OR REPLACE FUNCTION FUN_CHECKIDCARD(PI_AAC002 VARCHAR2)
  RETURN VARCHAR2 IS

/******************************************************************************
  *  程序名:身份证合法性校验FUN_CHECKIDCARD
  * 程序功能:对人员的身份证合法性进行校验
  *   输入:身份证号码
  *   输出:返回值: 0 合法;
  * 版本日期:2015-01-16
  * 执行类型:用户手工执行
  * 修改过程:
  ******************************************************************************/
  TYPE UDT_CHECK IS TABLE OF NUMBER;
  UDO_CHECK UDT_CHECK := UDT_CHECK(7,
                                   9,
                                   10,
                                   5,
                                   8,
                                   4,
                                   2,
                                   1,
                                   6,
                                   3,
                                   7,
                                   9,
                                   10,
                                   5,
                                   8,
                                   4,
                                   2); --初始化校验位

L_RESULT NUMBER := 0;
  L_STR    NUMBER;
BEGIN
  --15位身份证
  IF LENGTHB(PI_AAC002) = 15 THEN
    --身份证号不对
    IF FUN_ISDATE('19' || SUBSTR(PI_AAC002, 7, 6)) = 0 THEN
      RETURN 1;
    END IF;
    IF FUN_ISNUMBER(PI_AAC002) = 0 THEN
      RETURN 2;
    END IF;
    --18位身份证
  ELSIF LENGTHB(PI_AAC002) = 18 THEN
    IF FUN_ISDATE(SUBSTR(PI_AAC002, 7, 8)) = 0 THEN
      RETURN 3;
    END IF;
    IF FUN_ISNUMBER(SUBSTR(PI_AAC002, 1, 17)) = 0 THEN
      RETURN 4;
    END IF;
    IF FUN_ISNUMBER(SUBSTR(PI_AAC002, 18, 1)) = 0 OR
       SUBSTR(PI_AAC002, 18, 1) <> 'x' OR SUBSTR(PI_AAC002, 18, 1) <> 'X' THEN
      RETURN 5;
    END IF;
  
    --验证校验位开始
    FOR I IN 1 .. LENGTH(PI_AAC002) - 1 LOOP
      L_STR    := SUBSTR(PI_AAC002, I, 1);
      L_RESULT := L_RESULT + L_STR * UDO_CHECK(I);
    END LOOP;
    L_STR := MOD(L_RESULT, 11);
    SELECT DECODE(L_STR,
                  0,
                  1,
                  1,
                  0,
                  2,
                  'X',
                  3,
                  9,
                  4,
                  8,
                  5,
                  7,
                  6,
                  6,
                  7,
                  5,
                  8,
                  4,
                  9,
                  3,
                  10,
                  2)
      INTO L_RESULT
      FROM DUAL;
    IF SUBSTR(PI_AAC002, LENGTH(PI_AAC002), 1) <> L_RESULT THEN
      RETURN 7;
    ELSE
      RETURN 0;
    END IF;
  ELSE
    RETURN 6;
  END IF;
  RETURN 0;
END FUN_CHECKIDCARD;

其中FUN_ISDATE 与FUN_ISNUMBER分别是判断是否是时间或着数据的函数:

CREATE OR REPLACE FUNCTION FUN_ISDATE(PI_PARAMETER VARCHAR2)
  RETURN VARCHAR2 IS
  L_VAL DATE;
BEGIN
  L_VAL := TO_DATE(NVL(PI_PARAMETER, 'a'), 'yyyy-mm-dd hh24:mi:ss');
  RETURN 1;
EXCEPTION
  WHEN OTHERS THEN
    RETURN 0;
END FUN_ISDATE;

CREATE OR REPLACE FUNCTION FUN_ISNUMBER(PI_PARAMETER VARCHAR2)
  RETURN VARCHAR2 IS
  L_VAL NUMBER;
BEGIN
  L_VAL := TO_NUMBER(NVL(PI_PARAMETER, 'a'));
  RETURN 1;
EXCEPTION
  WHEN OTHERS THEN
    RETURN 0;
END FUN_ISNUMBER;

PLSQL存储过程校验身份证的更多相关文章

  1. JS校验身份证号的合法性

    前端表单中有身份证号的校验,下边是用JS来校验身份证号的合法性. 中国居民身份证号码编码规则 第一.二位表示省(自治区.直辖市.特别行政区). 第三.四位表示市(地级市.自治州.盟及国家直辖市所属市辖 ...

  2. oracel存储过程编写 以及plsql存储过程的debug

    1.语法: create or replace procedure messagebackup_createTable       //此处存储过程名称不能超过30个字符 as  tableName ...

  3. plsql 存储过程 测试

      plsql 存储过程 测试 CreationTime--2018年8月14日09点54分 Author:Marydon 1.找到要运行的存储过程-->选中-->右键-->测试 2 ...

  4. js 校验身份证号

    根据地区编码.身份证格式.18位身份证需要验证最后一位校验位 //校验身份证 function IdentityCodeValid(code) { var city = { 11: "北京& ...

  5. Oracle/PLSQL存储过程详解

    原文链接:https://blog.csdn.net/zezezuiaiya/article/details/79557621 Oracle/PLSQL存储过程详解 2018-03-14 17:31: ...

  6. Java中校验身份证号合法性(真伪),获取出生日期、年龄、性别、籍贯

    开发过程中有用的身份证号的业务场景,那么校验身份证的合法性就很重要了,另外还有通过身份证获取出生日期.年龄.性别.籍贯等信息, 下面是本人在开发中用到的关于校验身份证真伪的工具类,可以直接拿来使用,非 ...

  7. js校验身份证

    1 <%@page contentType="text/html;charset=UTF-8" pageEncoding="UTF-8" %> &l ...

  8. Js正则校验身份证号码

    原文链接:http://gongwen.sinaapp.com/article-126-cmd 这个其实不难,在网上多找一下总会有意外收获的.但是工欲善其事,必先利其器.我们需要了解一下身份证号的规则 ...

  9. java校验身份证号码

    /** * 18位身份证校验,粗略的校验 * @author lyl * @param idCard * @return */ public static boolean is18ByteIdCard ...

随机推荐

  1. AFNetworking使用

    1.访问网络获取Json //Get方法 NSString *str = @"http://api.xxx.cc/product/found.jhtml"; NSDictionar ...

  2. View的个得区域函数getHitRect,getDrawingRect,getLocalVisibleRect,getGlobalVisibleRect(*)

    注意: OnCreate()函数中 调用下面函数,结果全为0,要等UI控件都加载完了才能得到绘制时的值. getHitRect 以父控件的左上为原点,计算当前view在父控件的区域,不管父控件在屏幕的 ...

  3. POJ 2065 SETI(高斯消元)

    题目链接:http://poj.org/problem?id=2065 题意:给出一个字符串S[1,n],字母a-z代表1到26,*代表0.我们用数组C[i]表示S[i]经过该变换得到的数字.给出一个 ...

  4. 查看局域网内某个ip的mac地址

      首先需要ping一下对方的ip,确保本地的arp表中缓存对方的ip和mac的关系 C:\Windows\System32>ping 192.168.1.231 正在 Ping 192.168 ...

  5. [HIHO1184]连通性二·边的双连通分量(双连通分量)

    题目链接:http://hihocoder.com/problemset/problem/1184 题意裸,写个博客记下输出姿势. /* ━━━━━┒ギリギリ♂ eye! ┓┏┓┏┓┃キリキリ♂ mi ...

  6. hdu 4952 Number Transformation (找规律)

    题目链接 题意:给你个x,k次操作,对于第i次操作是:要找个nx,使得nx是>=x的最小值,且能整除i,求k次操作后的数 分析: 经过打表找规律,会发现最后的x/i,这个倍数会趋于一个固定的值, ...

  7. Android布局详解之一:FrameLayout

      原创文章,如有转载,请注明出处:http://blog.csdn.net/yihui823/article/details/6702273 FrameLayout是最简单的布局了.所有放在布局里的 ...

  8. asp.net 2.0中新增的web.config的默认namespace功能 (转)

    看上去这个题目比较长,但实际上,我在看资料时发现,这就是说,在asp.net 2.0中,只需要在web.config里定义你要用的那些namespace,则在aspx页面中就不需要再象1.1那样,用 ...

  9. (转)c语言_链表实例讲解(两个经典例子)

    建立一个学生成绩的线性链表,对其实现插入,删除,输出,最后销毁. #include <stdio.h>#include <stdlib.h> struct grade {    ...

  10. poj 2762 Going from u to v or from v to u?

    题目描述:为了让他们的儿子变得更勇敢些,Jiajia和Wind将他们带到一个大洞穴中.洞穴中有n个房间,有一些单向的通道连接某些房间.每次,Wind选择两个房间x和y,要求他们的一个儿子从一个房间走到 ...