使用触发器进行高级误差校验

日期: 2008-09-11 作者:Brian Peasland翻译:April 来源:TechTarget中国 英文

问:你好,我有一个这样的表:create table test(sumdgt number(5));在上面的表中,我不能访问总和为8的列。   例如它应该接受: insert into test values(21); insert into test values(11);   它不应该接受: insert into test values(71); (7+1=8) insert into test&nb……

我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。

我原创,你原创,我们的内容世界才会更加精彩!

【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】

微信公众号

TechTarget微信公众号二维码

TechTarget

官方微博

TechTarget中国官方微博二维码

TechTarget中国

电子邮件地址不会被公开。 必填项已用*标注

敬请读者发表评论,本站保留删除与本文无关和不雅评论的权力。

问:你好,我有一个这样的表:create table test(sumdgt number(5));在上面的表中,我不能访问总和为8的列。

  例如它应该接受:

insert into test values(21); insert into test values(11);

  它不应该接受:


insert into test values(71); (7+1=8) insert into test values(17000); (1+7+0+0+0)=8 insert into test values(26); (2+6=8)

  谢谢。

  答:唯一进行这种高级错误校验的方法(或者业务规则)就是使用触发器。该触发器必须分析被插入的数据,一个字符一个字符地进行分析并且总结归纳的数字。这样的一个触发器如下所示:

create OR REPLACE TRIGGER test_no_8
BEFORE insert ON test
FOR EACH ROW
DECLARE
   i   NUMBER;
   sum NUMBER;
   len NUMBER;
BEGIN
   /* set sum of digits to zero */
   sum:=0;
   /* get length of string to be inserted */
   len:=LENGTH(:new.column_1);
   /* loop through string. Add individual digits */
   /* to the sum.                                */
   FOR i IN 1..len LOOP
         sum:=sum+SUBSTR(:new.column_1,i,1);
   END LOOP;
   /* If sum is 8, then raise an error. */
   /* otherwise, do nothing             */
   IF sum=8 THEN
      RAISE insert_error;
EXCEPTION
   WHEN insert_error THEN
      RAISE_APPLICATION_ERROR(-20001,’String digits equals 8’);
END;

  你应该测试一下我刚刚写的代码,我自己没有进行测试,但是应该是没有问题的。

作者

Brian Peasland
Brian Peasland

Techtarget旗下Searchoracle网站的资深专家,有16年IT行业经验、计算机科学硕士、专攻数据库方向,曾担任系统管理员等职。此外,他还获Oracle 7.3、8和8i的OCP数据库管理员证书,目前为SGT Inc.公司首席DBA。

翻译

April
April

相关推荐