表:id        stdate       jg            enddate
1         2010-9-1  6        
2         2010-1-4  2              2010-3-4
3         2010-1-3  不计算      
4         2010-7-2  赞不用    我有一个字段    jg  ,可能存放的数字,也可能写的汉字
我想做一个函数实现如果jg是数字就实现    enddate=  stdate+jg
如果jg不是数字  就让enddate  留空
请问  怎么实现?

解决方案 »

  1.   

    --oracle没有提供好的函数,你可以自己写一个,很简单,这个问题讨论过很久了,你随便挑一个就行
    1. 利用 to_number
    CREATE OR REPLACE FUNCTION isnumeric (str IN VARCHAR2)
        RETURN NUMBER
    IS
        v_str FLOAT;
    BEGIN
        IF str IS NULL
        THEN
           RETURN 0;
        ELSE
           BEGIN
              SELECT TO_NUMBER (str)
                INTO v_str
                FROM DUAL;
           EXCEPTION
              WHEN INVALID_NUMBER
              THEN
                 RETURN 0;
           END;       RETURN 1;
        END IF;
    END isnumeric;
    2. 利用 regexp_like
    CREATE OR REPLACE FUNCTION isnumeric (str IN VARCHAR2)
        RETURN NUMBER
    IS
    BEGIN
        IF str IS NULL
        THEN
           RETURN 0;
        ELSE
           IF regexp_like (str, '^(-{0,1}+{0,1})[0-9]+(.{0,1}[0-9]+)$')
           THEN
              RETURN 1;
           ELSE
              RETURN 0;
           END IF;
        END IF;
    END isnumeric;
    3. 利用 TRANSLATE
    CREATE OR REPLACE FUNCTION isnumeric (str IN VARCHAR2)
        RETURN NUMBER
    IS
        v_str VARCHAR2 (1000);
    BEGIN
        IF str IS NULL
        THEN
           RETURN 0;
        ELSE
           v_str := TRANSLATE (str, '.0123456789', '.');       IF v_str = '.' OR v_str = '+.' OR v_str = '-.' OR v_str IS NULL
           THEN
              RETURN 1;
           ELSE
              RETURN 0;
           END IF;
        END IF;
    END isnumeric;