oracle中如何判断字符串是否全为数字,以及从任意字符串中提取数字
    本文介绍了判断字符串是否全为数字的4种办法,另外还介绍了一个translate函数的小技巧,从任意字符串中提取数字(调用2次translate函数)。这个办法是一个公司同事发现的,用起来很方便,但理解起来稍有点困难。
1、通过ASCII码判断是否数字,介于[48, 57]之间,(ascii('0') = 48, ascii('9') = '57')
2、调用cast函数尝试强制转换成NUMERIC或NUMBER,不是合法数字串即抛异常
3、调用translate函数,剔除所有[0-9]数字后,看是否为空串
4、调用正则表达式,进行模式匹配(10g版本新加入的功能)
[SQL] view plaincopy
01.--通过ASCII码判断是否数字,介于[48, 57]之间,(ascii('0') = 48, ascii('9') = '57')  
02.DECLARE  
03.    str             VARCHAR2(10) := '123a';  
04.    val             NUMERIC(10);  
05.    i               int;  
06.    k               int;  
07.    flag            BOOLEAN;  
08.BEGIN  
09.    flag := TRUE;  
10.    for i in 1..10 loop   --新密码是否6位数字  
11.        k := ascii(substr(str, i, 1));  
12.        if k < 48 or k > 57 THEN  
13.            flag := FALSE;  
14.        end if;  
15.    end LOOP;  
16.      
17.    IF flag = true THEN  
18.        dbms_output.put_line(str || '是[0-9]的数字序列');  
19.    ELSE  
20.        dbms_output.put_line(str || '不是[0-9]的数字序列');  
21.    END IF;  
22.END;  
23.  
24.-- 调用cast函数尝试强制转换成NUMERIC或NUMBER,不是合法数字串即抛异常  
25.DECLARE  
26.    str    VARCHAR2(10) := '123';  
27.    val    NUMERIC(10);  
28.BEGIN  
29.    val := CAST(str AS NUMERIC);  
30.    dbms_output.put_line(str || '是[0-9]的数字序列');  
31.EXCEPTION  
32.   WHEN value_error THEN -- 字符串转实数错误  
33.       --dbms_output.put_line(SQLCODE || ', ' || SQLERRM);  
34.       dbms_output.put_line(str || '不是[0-9]的数字序列');  
35.END;  
36.  
37.--调用translate函数,剔除所有[0-9]数字后,看是否为空串  
38.DECLARE  
39.    str VARCHAR2(10) := '123abc';  
40.BEGIN  
41.    IF replace(translate(str, '0123456789', '0'), '0', '') IS NULL THEN  
42.        dbms_output.put_line(str || '是[0-9]的数字序列');  
43.    ELSE  
44.        dbms_output.put_line(str || '不是[0-9]的数字序列');  
45.    END IF;  
46.END;  
47.  
48.--调用正则表达式,进行模式匹配(10g版本新加入的功能)  
49.SELECT *  
50.FROM dual  
51.WHERE regexp_like('1234', '^[[:digit:]]+$');  
52.  
53.--从任意字符串中提取数字串(调用2次translate函数)。  
54.--假定初始串为str。首先将str中数字全部替换为空格,输出记为str2;  
55.--其次,对每个在str中出现的任意str2串中字符,如果是str2的首字符则替换为空格,其它字符则全部剔除  
56.DECLARE  
57.    --str    VARCHAR2(100) := ' 护照01浙江2     3昆 山4苏 3';  
58.    str    VARCHAR2(100) := ' 护照浙江     昆 山苏 4';  
59.    ret&nbs