Oracle触发器-校验身份证和字节长度
一、Oracle触发器的一个简单介绍:
触发器:是特定事件出现的时候,自动执行的代码块。类似于存储过程,但是用户不能直接调用他们。
功 能:
1.允许、限制对表的修改
2.自动生成派生列,比如自增字段
3.强制数据一致性
4.提供审计和日志记录
5.防止无效的事务处理
6.启用复杂的业务逻辑
触发器的组成部分:
1.触发器名称
2.触发语句
3.触发器限制
4.触发操作
如:
1️⃣触发器名称
create or replace trigger trig_etc(触发器名称)
命名习惯
create or replace trigger 触发器名称 before/after insert or update or delete on 表名for each nowbeginif XXXX thenend if;end;
注:这个属于常规写法吧!
2️⃣触发语句
比如:
表或试图上的DML语句
DDL语句
数据库关闭或者启动,startup shutdown等等。。。
before/after insert or update or deletereferencing old as old_value new as new_valuefor each rowETC_Card 表名card_id 列名
3️⃣触发器限制
when (new_value.card_id<>1 )
限制不是必须的。此例表示如果列card_id不等于1的时候,触发器就会执行。
其中的new_value是代表更新之后的值
4️⃣触发操作
是触发器的主体
begin:new_value.commission_pct :=0;end;
主体很简单,就是将更新后的commission_pct列置为0
二、触发器实战
由于业务要求,需要让其中一个字段不能超过8个字节,两一个字符串的第一个字节必须是1,最后一个是身份证号最后一个字节的校验,要求是字母只能是X,不能是其他字母,数字随意;
由此业务要求参数下面触发器:
create or replace trigger trg_etc--是在它插入数据之前触发before insert on Etc_Card_Info_New for each row
begin--往日志表中插记录insert into ETC_LOG VALUES(systimestamp,:new.card_no || '|' || :new.AGENTNAME,'trg_etc',0,'');--第一个要求是AGENTNAME列不能超过8个字节if length(:NEW.AGENTNAME) > 8 thenRAISE_APPLICATION_ERROR(-20001,'经办人姓名不能超过四个汉字!');end if;--第二个要求是AGENTIDTYPE列中的字符串第一个字节必须是1if SUBSTR(:NEW.AGENTIDTYPE,1,1) <> '1' thenRAISE_APPLICATION_ERROR(-20002,'个人经办人证件类型必须是以1开头的');end if;--第三个要求是身份证合法性并且对身份证最后一个字节的校验if SUBSTR(:NEW.AGENTIDTYPE,1,1) = '1' thenif fn_checkidcard(:NEW.AGENTIDTYPE) = 1 thenif INSTR(SUBSTR(:NEW.AGENTIDNUM,-1),'0') = 0 or INSTR(SUBSTR(:NEW.AGENTIDNUM,-1),'1') = 0 or INSTR(SUBSTR(:NEW.AGENTIDNUM,-1),'2') = 0 orINSTR(SUBSTR(:NEW.AGENTIDNUM,-1),'3') = 0 or INSTR(SUBSTR(:NEW.AGENTIDNUM,-1),'4') = 0 or INSTR(SUBSTR(:NEW.AGENTIDNUM,-1),'5') = 0 orINSTR(SUBSTR(:NEW.AGENTIDNUM,-1),'6') = 0 or INSTR(SUBSTR(:NEW.AGENTIDNUM,-1),'7') = 0 or INSTR(SUBSTR(:NEW.AGENTIDNUM,-1),'8') = 0 or INSTR(SUBSTR(:NEW.AGENTIDNUM,-1),'9') = 0 or INSTR(SUBSTR(:NEW.AGENTIDNUM,-1),'X') = 0 thenRAISE_APPLICATION_ERROR(-20003,'个人经办人证件号码最后一位字母只能是X!');end if;elseRAISE_APPLICATION_ERROR(-20004,'个人身份证号不符合规范!'); end if;end if;END trg_etc;
注:附上校验身份证的Oracle函数脚本
CREATE OR REPLACE FUNCTION fn_checkidcard (p_idcard IN VARCHAR2) RETURN INT
ISv_regstr VARCHAR2 (2000);v_sum NUMBER;v_mod NUMBER;v_checkcode CHAR (11) := '10X98765432';v_checkbit CHAR (1);v_areacode VARCHAR2 (2000) := '11,12,13,14,15,21,22,23,31,32,33,34,35,36,37,41,42,43,44,45,46,50,51,52,53,54,61,62,63,64,65,71,81,82,91,';
BEGINCASE LENGTHB (p_idcard)WHEN 15THEN -- 15位IF INSTRB (v_areacode, SUBSTR (p_idcard, 1, 2) || ',') = 0 THENRETURN 0;END IF;IF MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 2)) + 1900, 400) = 0OR(MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 2)) + 1900, 100) <> 0ANDMOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 2)) + 1900, 4) = 0)THEN -- 闰年v_regstr :='^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}$';ELSEv_regstr :='^[1-9][0-9]{5}[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}$';END IF;IF REGEXP_LIKE (p_idcard, v_regstr) THENRETURN 1;ELSERETURN 0;END IF;WHEN 18THEN -- 18位IF INSTRB (v_areacode, SUBSTRB (p_idcard, 1, 2) || ',') = 0 THENRETURN 0;END IF;IF MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 4)), 400) = 0OR(MOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 4)), 100) <> 0ANDMOD (TO_NUMBER (SUBSTRB (p_idcard, 7, 4)), 4) = 0)THEN -- 闰年v_regstr :='^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|[1-2][0-9]))[0-9]{3}[0-9Xx]$';ELSEv_regstr :='^[1-9][0-9]{5}(19|20)[0-9]{2}((01|03|05|07|08|10|12)(0[1-9]|[1-2][0-9]|3[0-1])|(04|06|09|11)(0[1-9]|[1-2][0-9]|30)|02(0[1-9]|1[0-9]|2[0-8]))[0-9]{3}[0-9Xx]$';END IF;IF REGEXP_LIKE (p_idcard, v_regstr) THENv_sum :=( TO_NUMBER (SUBSTRB (p_idcard, 1, 1))+ TO_NUMBER (SUBSTRB (p_idcard, 11, 1)))* 7+ ( TO_NUMBER (SUBSTRB (p_idcard, 2, 1))+ TO_NUMBER (SUBSTRB (p_idcard, 12, 1)))* 9+ ( TO_NUMBER (SUBSTRB (p_idcard, 3, 1))+ TO_NUMBER (SUBSTRB (p_idcard, 13, 1)))* 10+ ( TO_NUMBER (SUBSTRB (p_idcard, 4, 1))+ TO_NUMBER (SUBSTRB (p_idcard, 14, 1)))* 5+ ( TO_NUMBER (SUBSTRB (p_idcard, 5, 1))+ TO_NUMBER (SUBSTRB (p_idcard, 15, 1)))* 8+ ( TO_NUMBER (SUBSTRB (p_idcard, 6, 1))+ TO_NUMBER (SUBSTRB (p_idcard, 16, 1)))* 4+ ( TO_NUMBER (SUBSTRB (p_idcard, 7, 1))+ TO_NUMBER (SUBSTRB (p_idcard, 17, 1)))* 2+ TO_NUMBER (SUBSTRB (p_idcard, 8, 1)) * 1+ TO_NUMBER (SUBSTRB (p_idcard, 9, 1)) * 6+ TO_NUMBER (SUBSTRB (p_idcard, 10, 1)) * 3;v_mod := MOD (v_sum, 11);v_checkbit := SUBSTRB (v_checkcode, v_mod + 1, 1);IF v_checkbit = upper(substrb(p_idcard,18,1)) THENRETURN 1;ELSERETURN 0;END IF;ELSERETURN 0;END IF;ELSERETURN 0; -- 身份证号码位数不对END CASE;
EXCEPTIONWHEN OTHERSTHENRETURN 0;
END fn_checkidcard;
Oracle触发器-校验身份证和字节长度相关推荐
- oracle查询值的字符串长度、字节长度、大小写字母转换
1.||--拼接符 SELECT str1, str2,str1 | | str2 AS str_concat FROM 表名; 2 LENGTH--字符串长度 SELECT LENGTH('ab') ...
- Java String类型数据的字节长度
问题描述: 向Oracle数据库中一varchar2(64)类型字段中插入一条String类型数据,程序使用String.length()来进行数据的长度校验,如果数据是纯英文,没有问题,但是如果数据 ...
- java string类型大小_Java String类型数据的字节长度
问题描述: 向Oracle数据库中一varchar2(64)类型字段中插入一条String类型数据,程序使用String.length()来进行数据的长度校 验,如果数据是纯英文,没有问题,但是如果数 ...
- JAVA返回指定字符串的长度,Java截取指定字节长度的字符串
在实际的项目中,我们后台的数据库是根据指定编码(如GBK)保存数据的,为防止操作数据库时,因字段值长度超过数据库定义的长度,须在JAVA甚至JS层面做长度的校验控制,如数据库定义的长度是varchar ...
- java String长度与varchar长度匹配理解(字符和字节长度理解)
java String长度与varchar长度匹配理解(字符和字节长度理解) string中的length()长度,返回的是char的数量,每个char可以存储世界上任何类型的文字和字符,一个char ...
- Java 常用工具类 - 校验身份证 IdCardUtils
身份证校验工具类 IdCardUtils import org.apache.commons.lang3.StringUtils;import java.text.ParseException; im ...
- java身份证工具类(校验身份证是否合法、通过身份证获取年龄、性别、生日,将15位身份证转为18位等)
一.简介 因为工作需要经常用到身份证做一些相关操作,于是通过查阅资料总结出一些常用的工具方法,包括校验身份证是否合法.通过身份证获取年龄.通过身份证获取性别.通过身份证获取户籍地址.通过身份证获取生日 ...
- Oracle 触发器(tigger)4
Oracle 触发器(tigger) 1 触发器类型 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行.即触发器是当某 ...
- [程序设计]前端Web页面使用原生JavaScript实现校验身份证号码在算法层面是否合法
中国大陆居民身份证号码第18位为校验码,用来验证本体码的准确性. 校验码采用ISO 7064:1983,MOD 11-2校验码系统. 因此可以对身份证号码第18位进行校验,来验证身份证号码在算法层面是 ...
最新文章
- php传递JSON数据
- LVS(15)——tun技术
- 转:并发与并行的区别
- 新建用户、付权限命令
- sql in里面可以放多少参数_如何从文本文件读入 SQL 参数
- C#LeetCode刷题之#226-翻转二叉树(Invert Binary Tree)
- 海量用户标签系统之存储架构设计(Bigmap算法)
- python print return不同_Python中return和print的作用及区别
- python cursor游标_python tuble、lambda及cursor游标相关
- Python >>> 基于UDP 协议的实时网络视频传输
- 计算机组策略恢复,Win10重置组策略编辑器的方法
- 测试 tolua 例子 TestErrorStack
- mac怎么设置锁屏壁纸,锁屏壁纸和屏幕壁纸不同
- Luogu P3369 【模板】普通平衡树
- 关于MAC下php出现:Call to undefined function Think\imagettftext()的解决办法
- 三角形问题 -软件测试
- 【PowerDesigner】UML建模
- 使用Qt获取系统版本
- ubuntu安装输入法----小企鹅输入法
- svn 错误信息:这是在主机名解析时通常出现的暂时错误,它意味着本地服务器没有从权威服务器上收到响应。