一、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触发器-校验身份证和字节长度相关推荐

  1. oracle查询值的字符串长度、字节长度、大小写字母转换

    1.||--拼接符 SELECT str1, str2,str1 | | str2 AS str_concat FROM 表名; 2 LENGTH--字符串长度 SELECT LENGTH('ab') ...

  2. Java String类型数据的字节长度

    问题描述: 向Oracle数据库中一varchar2(64)类型字段中插入一条String类型数据,程序使用String.length()来进行数据的长度校验,如果数据是纯英文,没有问题,但是如果数据 ...

  3. java string类型大小_Java String类型数据的字节长度

    问题描述: 向Oracle数据库中一varchar2(64)类型字段中插入一条String类型数据,程序使用String.length()来进行数据的长度校 验,如果数据是纯英文,没有问题,但是如果数 ...

  4. JAVA返回指定字符串的长度,Java截取指定字节长度的字符串

    在实际的项目中,我们后台的数据库是根据指定编码(如GBK)保存数据的,为防止操作数据库时,因字段值长度超过数据库定义的长度,须在JAVA甚至JS层面做长度的校验控制,如数据库定义的长度是varchar ...

  5. java String长度与varchar长度匹配理解(字符和字节长度理解)

    java String长度与varchar长度匹配理解(字符和字节长度理解) string中的length()长度,返回的是char的数量,每个char可以存储世界上任何类型的文字和字符,一个char ...

  6. Java 常用工具类 - 校验身份证 IdCardUtils

    身份证校验工具类 IdCardUtils import org.apache.commons.lang3.StringUtils;import java.text.ParseException; im ...

  7. java身份证工具类(校验身份证是否合法、通过身份证获取年龄、性别、生日,将15位身份证转为18位等)

    一.简介 因为工作需要经常用到身份证做一些相关操作,于是通过查阅资料总结出一些常用的工具方法,包括校验身份证是否合法.通过身份证获取年龄.通过身份证获取性别.通过身份证获取户籍地址.通过身份证获取生日 ...

  8. Oracle 触发器(tigger)4

    Oracle 触发器(tigger) 1 触发器类型 触发器在数据库里以独立的对象存储,它与存储过程和函数不同的是,存储过程与函数需要用户显示调用才执行,而触发器是由一个事件来启动运行.即触发器是当某 ...

  9. [程序设计]前端Web页面使用原生JavaScript实现校验身份证号码在算法层面是否合法

    中国大陆居民身份证号码第18位为校验码,用来验证本体码的准确性. 校验码采用ISO 7064:1983,MOD 11-2校验码系统. 因此可以对身份证号码第18位进行校验,来验证身份证号码在算法层面是 ...

最新文章

  1. php传递JSON数据
  2. LVS(15)——tun技术
  3. 转:并发与并行的区别
  4. 新建用户、付权限命令
  5. sql in里面可以放多少参数_如何从文本文件读入 SQL 参数
  6. C#LeetCode刷题之#226-翻转二叉树(Invert Binary Tree)
  7. 海量用户标签系统之存储架构设计(Bigmap算法)
  8. python print return不同_Python中return和print的作用及区别
  9. python cursor游标_python tuble、lambda及cursor游标相关
  10. Python >>> 基于UDP 协议的实时网络视频传输
  11. 计算机组策略恢复,Win10重置组策略编辑器的方法
  12. 测试 tolua 例子 TestErrorStack
  13. mac怎么设置锁屏壁纸,锁屏壁纸和屏幕壁纸不同
  14. Luogu P3369 【模板】普通平衡树
  15. 关于MAC下php出现:Call to undefined function Think\imagettftext()的解决办法
  16. 三角形问题 -软件测试
  17. 【PowerDesigner】UML建模
  18. 使用Qt获取系统版本
  19. ubuntu安装输入法----小企鹅输入法
  20. svn 错误信息:这是在主机名解析时通常出现的暂时错误,它意味着本地服务器没有从权威服务器上收到响应。

热门文章

  1. 阿里P5-基础知识3
  2. R中的留一法交叉验证(带有示例)
  3. 如何用css排段落,标准网页中用CSS进行段落排版的方法
  4. Java使用GeoTools轻松读取shapefile文件内容
  5. 25岁,毕业一年辞职自学转行嵌入式是否可行?
  6. anu - browser
  7. 智慧管廊综合监管平台
  8. 15台电脑无盘服务器配置,15台有盘网吧电脑配置、服务器配置、
  9. 最长不重复子串(java)
  10. 南航TRANS复现: 电容电流前馈+电网电压全前馈_单相LCL并网逆变器仿真