问题简单表述如下:
表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中有没有函数可以判断某个值是数值?如果没有的话如何判断一个值是数值而不是其他字母?多谢了。

解决方案 »

  1.   

    select * from xxx where translate(column1,'1234567890','') = column1;
      

  2.   

    应该是
    select * from xxx where translate(column1,'1234567890','$') = column1;
    吧。
      

  3.   

    CREATE OR REPLACE Trg_RecordChk
    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;
      

  4.   

    谢谢大家。应该是
    select * from xxx where translate(column1,'1234567890','$') = column1;
    吧。
    ======================
    然后继续对column1进行判断吗?
      

  5.   

    多谢qiaozhiwei(乔),你的方法我用了,果然很好用,谢谢了。
      

  6.   

    然后继续对column1进行判断吗?
    ------
    不是啊,
    IF  :NEW.F不是数值 THEN
    换成
    IF  :NEW.F<>translate(:NEW.F,'1234567890','$') THEN
    就行了
      

  7.   

    IF  :NEW.F不是数值 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’这么判断好像不行吧
      

  8.   

    是不是可以这样?IF  translate(:NEW.F,'1234567890','$') = ‘$’ THEN
      

  9.   

    对不起,实际编译的时候发现示例中EXIT应该换成RETURN。
    exit是跳出loop用的。
      

  10.   

    楼主还是用qiaozhiwei(乔)的方法吧。
    我的方法只能判断字母中是否含有数字
      

  11.   

    TO:xxc1981(asf)你说得对,其实这些东西在应用层(比如vb画面)里实现更好,但是项目要求如此,我也没有办法。
    况且,多学会一种检验方法总是好事。