问题简单表述如下:
表table_a有6个字段,A,B,C,D,E,F。其中,A,B,C是主键,D是varchar(3)的error code,E是varchar(6)的年月,F是varchar(4)的销售额。D的设置取决于E和F的值,如果E的年月不合法,则将D置为‘001’,如果F的销售额不合法,则将D置为‘002’。我需要做一个trigger,在table_a中插入或者更新纪录的时候,根据E和F的值,设置D的值。
trigger大致如下:--------------------------------------------------------
CREATE OR REPLACE Trg_RecordChk
BEFORE INSERT OR UPDATE ON table_a
FOR EACH ROW
BEGIN
IF :NEW.E的月份不在1-12之间 THEN
:NEW.D := '001';
EXIT;
END IF; IF :NEW.F不是数值 THEN
:NEW.D := '002';
EXIT;
END IF;
END Trg_RecordChk;
------------------------------------对于E的月份判断,我想可以通过截取字符串的后两位进行判断,但是对于F的判断,我没有找到一个函数可以判断某个字段的值是数值(比如F的值是'100a'而不是'1000').请教各位达人,oracle中有没有函数可以判断某个值是数值?如果没有的话如何判断一个值是数值而不是其他字母?多谢了。
表table_a有6个字段,A,B,C,D,E,F。其中,A,B,C是主键,D是varchar(3)的error code,E是varchar(6)的年月,F是varchar(4)的销售额。D的设置取决于E和F的值,如果E的年月不合法,则将D置为‘001’,如果F的销售额不合法,则将D置为‘002’。我需要做一个trigger,在table_a中插入或者更新纪录的时候,根据E和F的值,设置D的值。
trigger大致如下:--------------------------------------------------------
CREATE OR REPLACE Trg_RecordChk
BEFORE INSERT OR UPDATE ON table_a
FOR EACH ROW
BEGIN
IF :NEW.E的月份不在1-12之间 THEN
:NEW.D := '001';
EXIT;
END IF; IF :NEW.F不是数值 THEN
:NEW.D := '002';
EXIT;
END IF;
END Trg_RecordChk;
------------------------------------对于E的月份判断,我想可以通过截取字符串的后两位进行判断,但是对于F的判断,我没有找到一个函数可以判断某个字段的值是数值(比如F的值是'100a'而不是'1000').请教各位达人,oracle中有没有函数可以判断某个值是数值?如果没有的话如何判断一个值是数值而不是其他字母?多谢了。
select * from xxx where translate(column1,'1234567890','$') = column1;
吧。
BEFORE INSERT OR UPDATE ON table_a
FOR EACH ROW
BEGIN
IF SUBSTR(:NEW.E,-2,2) NOT BETWEEN '01' AND '12' THEN
:NEW.D := '001';
EXIT;
END IF; BEGIN
:NEW.F := TO_CHAR(TO_NUMBER(:NEW.F));
EXCEPTION
WHEN OTHERS THEN
:NEW.D := '002';
EXIT;
END;END Trg_RecordChk;
select * from xxx where translate(column1,'1234567890','$') = column1;
吧。
======================
然后继续对column1进行判断吗?
------
不是啊,
IF :NEW.F不是数值 THEN
换成
IF :NEW.F<>translate(:NEW.F,'1234567890','$') THEN
就行了
换成
IF :NEW.F<>translate(:NEW.F,'1234567890','$') THEN
就行了==================如果:NEW.F = ‘2341’,那么translate(:NEW.F,'1234567890','$')=‘$’
如果:NEW.F = ‘23dafd41dfd’,那么translate(:NEW.F,'1234567890','$')=‘$dafd$dfd’这么判断好像不行吧
exit是跳出loop用的。
我的方法只能判断字母中是否含有数字
况且,多学会一种检验方法总是好事。