当前位置: 首页 > news >正文

oracle 11g写一个判断是否是身份证的函数,函数名称为:FUN_IS_IDENNO

下面是一个用于判断是否是身份证号码的Oracle 11g函数(FUN_IS_IDENNO)。身份证号码通常为18位(或者旧的15位),前17位为数字,第18位为数字或字母X,并且需要符合一定的规则,例如出生日期是否合理,校验位是否正确等。函数来自chatgpt,测试无误

函数逻辑:

  • 1 输入参数:p_idenno,传入的身份证号码。
  • 2 校验逻辑
    1. 判断身份证号的长度是否为18位。
    2. 检查前17位是否为数字。
    3. 验证生日部分是否为有效日期。
    4. 通过身份证的加权因子和校验位规则计算第18位校验码是否正确。
  • 3 返回值
    1. YES 表示身份证号有效。
    2. NO 表示身份证号无效。

在线身份证校验
测试: SELECT FUN_IS_IDENNO('610427197005053353') "是" ,FUN_IS_IDENNO('610424198505184124') "否" FROM DUAL;

CREATE OR REPLACE FUNCTION FUN_IS_IDENNO(p_idenno IN VARCHAR2)
RETURN VARCHAR2
ISv_result VARCHAR2(3) := 'NO';v_iden_length PLS_INTEGER;v_birthday VARCHAR2(8);v_year PLS_INTEGER;v_month PLS_INTEGER;v_day PLS_INTEGER;v_check_digit CHAR(1);v_check_sum PLS_INTEGER := 0;v_weights PLS_INTEGER := 0;v_multipliers CONSTANT SYS.ODCINUMBERLIST := SYS.ODCINUMBERLIST(7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2);v_check_chars CONSTANT VARCHAR2(11) := '10X98765432';
BEGIN-- 获取身份证号码长度v_iden_length := LENGTH(p_idenno);-- 校验身份证长度是否为18位IF v_iden_length = 18 THEN-- 校验前17位是否为数字IF REGEXP_LIKE(SUBSTR(p_idenno, 1, 17), '^\d{17}$') THEN-- 校验出生日期是否合理v_birthday := SUBSTR(p_idenno, 7, 8);v_year := TO_NUMBER(SUBSTR(v_birthday, 1, 4));v_month := TO_NUMBER(SUBSTR(v_birthday, 5, 2));v_day := TO_NUMBER(SUBSTR(v_birthday, 7, 2));IF v_year BETWEEN 1900 AND EXTRACT(YEAR FROM SYSDATE) AND v_month BETWEEN 1 AND 12 THENIF (v_month = 2 AND v_day BETWEEN 1 AND 29 AND MOD(v_year, 4) = 0 AND (MOD(v_year, 100) <> 0 OR MOD(v_year, 400) = 0)) OR(v_month = 2 AND v_day BETWEEN 1 AND 28 AND (MOD(v_year, 4) <> 0 OR (MOD(v_year, 100) = 0 AND MOD(v_year, 400) <> 0))) OR(v_month IN (1, 3, 5, 7, 8, 10, 12) AND v_day BETWEEN 1 AND 31) OR(v_month IN (4, 6, 9, 11) AND v_day BETWEEN 1 AND 30) THEN-- 计算校验位FOR i IN 1..17 LOOPv_weights := TO_NUMBER(SUBSTR(p_idenno, i, 1)) * v_multipliers(i);v_check_sum := v_check_sum + v_weights;END LOOP;-- 获取计算出的校验位v_check_digit := SUBSTR(v_check_chars, MOD(v_check_sum, 11) + 1, 1);-- 校验第18位是否正确IF v_check_digit = SUBSTR(p_idenno, 18, 1) THENv_result := 'YES';END IF;END IF;END IF;END IF;END IF;RETURN v_result;
END FUN_IS_IDENNO;
/
http://www.lryc.cn/news/442442.html

相关文章:

  • 如何使用Spring Cloud Gateway搭建网关系统
  • 油烟机制造5G智能工厂物联数字孪生平台,推进制造业数字化转型
  • 《拿下奇怪的前端报错》序章:报错输出个数值数组Buffer(475) [Uint8Array],我来教它说人话!
  • Docker 里面按照ifconfig
  • DOS(Disk Operating System,磁盘操作系统)常用指令
  • VSCode集成Python环境搭建配置详细步骤
  • OpenHarmony(鸿蒙南向开发)——小型系统内核(LiteOS-A)【扩展组件】上
  • Windows【环境 01】服务器系统重装后的服务恢复(ES\Redis\Jafka\Tomcat)环境变量和服务注册
  • 发现编程的全新境界——明基RD280U显示器使用体验
  • 使用阿里OCR身份证识别
  • 8. 详细描述一条 SQL 语句在 MySQL 中的执行过程。
  • C++--类的实例化
  • Vue vs React vs Angular 的对比和选择
  • Yolov8-pose关键点检测:一种新的自适应算法轻量级通道分割和变换(ALSS)模块,解决红外检测场景存在严重遮挡和重叠目标时的局限性
  • 无人机飞手培训机构六旋翼训练无人机技术详解
  • CX8903:电动车手机充电器降压芯片,搭配协议实现快充
  • leaflet加载GeoServer的WMS地图服务.md
  • Shire 智能体市场:IDE 一键安装多智能体,协同打造集体智慧 Copilot
  • 机器学习笔记(一)初识机器学习
  • linux如何查看当前的目录所在位置
  • 【JavaEE】线程创建和终止,Thread类方法,变量捕获(7000字长文)
  • [Python数据可视化] Plotly:交互式数据可视化的强大工具
  • Excel--DATEDIF函数的用法及参数含义
  • 执行网络攻击模拟的 7 个步骤
  • 技术成神之路:设计模式(十四)享元模式
  • 使用systemctl实现开机自启动jar包
  • 2024.9.20营养小题【2】(动态分配二维数组)
  • 前端web端项目运行的时候没有ip访问地址
  • 微服务架构陷阱与挑战
  • react的事件绑定