li
  当前位置:主页 > 性能优化 > 文章内容
li
判断是否数字类型(二)
来源: http://yangtingkun.itpub.net/  作者: yangtingkun    时间:2008-01-26   阅读:7  
本文章共1847字,分2页,当前第1页,快速翻页:
 

经常看到有人提出这样的需求,判断一个字符串的内容是否是数值。于是写了两种两个判断是否属于NUMBER类型的函数。

发现上一篇文章中,给出的自定义函数的方法确实了对科学技术法的判断。这里将其补充上。

判断是否数字类型:http://yangtingkun.itpub.net/post/468/57289


前两天在看论坛的帖子时发现有人提到了这个问题,随着讨论的深入,我发现了自己实现的第二个函数缺少了对科学技术法的判断。

于是将函数进行了一下修改:

SQL> CREATE OR REPLACE FUNCTION F_IS_NUM1(P_NUM IN VARCHAR2) RETURN VARCHAR2 AS
2 V_NUM_DOT NUMBER DEFAULT 0;
3 V_E_POSITION NUMBER DEFAULT 0;
4 BEGIN
5 IF P_NUM IS NULL THEN
6 RETURN NULL;
7 END IF;
8 FOR I IN 1..LENGTH(P_NUM) LOOP
9 CASE SUBSTR(P_NUM, I, 1)
10 WHEN '0' THEN NULL;
11 WHEN '1' THEN NULL;
12 WHEN '2' THEN NULL;
13 WHEN '3' THEN NULL;
14 WHEN '4' THEN NULL;
15 WHEN '5' THEN NULL;
16 WHEN '6' THEN NULL;
17 WHEN '7' THEN NULL;
18 WHEN '8' THEN NULL;
19 WHEN '9' THEN NULL;
20 WHEN 'E' THEN
21 IF I = 1 OR I = LENGTH(P_NUM) THEN
22 RETURN 'N';
23 ELSIF V_E_POSITION != 0 THEN
24 RETURN 'N';
25 ELSE
26 V_E_POSITION := I;
27 END IF;
28 WHEN 'e' THEN
29 IF I = 1 OR I = LENGTH(P_NUM) THEN
30 RETURN 'N';
31 ELSIF V_E_POSITION != 0 THEN
32 RETURN 'N';
33 ELSE
34 V_E_POSITION := I;
35 END IF;
36 WHEN '.' THEN
37 IF I > V_E_POSITION AND V_E_POSITION != 0 THEN
38 RETURN 'N';
39 END IF;
40 V_NUM_DOT := V_NUM_DOT 1;
41 IF V_NUM_DOT > 1 THEN
42 RETURN 'N';
43 END IF;
44 WHEN '-' THEN
45 IF I != V_E_POSITION 1 THEN
46 RETURN 'N';
47 END IF;
48 WHEN ' ' THEN
49 IF I != V_E_POSITION 1 THEN
50 RETURN 'N';
51 END IF;
52 ELSE RETURN 'N';
53 END CASE;
54 END LOOP;
55 IF SUBSTR(P_NUM, -1, 1) IN (' ', '-', 'E', 'e') THEN
56 RETURN 'N';
57 ELSE
58 RETURN 'Y';
59 END IF;
60 END;
61 /

函数已创建。

SQL> CREATE TABLE T (NUM_STR VARCHAR2(100));

表已创建。

SQL> INSERT INTO T VALUES ('-5');

已创建 1 行。

SQL> INSERT INTO T VALUES ('2.2342');

已创建 1 行。

SQL> INSERT INTO T VALUES (' 123.1234');

已创建 1 行。

www.ixdba.net


SQL> INSERT INTO T VALUES ('-5-34');

已创建 1 行。

SQL> INSERT INTO T VALUES ('1230234J342');

已创建 1 行。

SQL> INSERT INTO T VALUES ('5.524.2');

已创建 1 行。

SQL> INSERT INTO T VALUES (' 5.23E23');

已创建 1 行。

SQL> INSERT INTO T VALUES ('-0.47e-2');

已创建 1 行。

SQL> INSERT INTO T VALUES ('345E 5');

已创建 1 行。

SQL> INSERT INTO T VALUES ('2E3.5');

已创建 1 行。

SQL> INSERT INTO T VALUES ('2E3E1');

已创建 1 行。

SQL> INSERT INTO T VALUES ('2E');

已创建 1 行。

SQL> INSERT INTO T VALUES ('2-');

已创建 1 行。

SQL> INSERT INTO T VALUES ('2.');

已创建 1 行。

SQL> COMMIT;

提交完成。

SQL> COL NUM_STR FORMAT A12
SQL> COL IS_NUM FORMAT A6
SQL> SELECT NUM_STR, F_IS_NUM1(NUM_STR) IS_NUM FROM T;

NUM_STR IS_NUM
------------ ------
-5 Y
2.2342 Y
123.1234 Y
-5-34 N
1230234J342 N
5.524.2 N
5.23E23 Y
-0.47e-2 Y
345E 5 Y
2E3.5 N



阅读更多内容1 · 2 · 下一页>>


  上一篇: FOR ALL语法浅析   下一篇: 编码规范的重要性——一次PLSQL程...
li
 §相关评论  
 热点文章

·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 编辑推荐
·Resize datafile导致ASM Crash
·在Oracle10g RAC下新增ASM磁盘
·ORACLE SQL性能优化系列 (一)
·oracle性能调优:管理oracle日志
·oracle RAC环境中系统时钟的调
·why:Rac的心跳线不支持交叉线?
·RAC的VIP及实例依赖关系:版本O
·如何启动DataGuard的备用数据库
·系统表空间IO错误 数据损坏处理
·不幸中的万幸:遭遇ORA-00600 [
·用ORACLE的高级复制实现内外网
li
 相关篇章
·FOR ALL语法浅析
·判断是否数字类型
·FORALL语句的小问题
·日期转换函数的格式参数大小写规...
·BULK COLLECT的小毛病
·通过触发器复制包含LONG类型的表
·计算月还款的小过程(三)
·计算月还款的小过程(二)
·计算月还款的小过程(一)
·Deterministic函数(二)
·编码规范的重要性——一次PLSQL程...
·10g的MAX、MIN的bug
·过程执行报错ORA-4068
·RETURNING语句几个小问题
·自定义聚集函数访问远端对象(一...
·自定义聚集函数访问远端对象(二...
·自定义聚集函数访问远端对象(三...
·一个处理操作系统文件属性的小函...
·计算个人所得税的函数
·UTL_FILE包的简单例子
 
li
设为首页 | 关于我们 | 技术服务 | 收藏本站 | 网站地图 | 联系方式 | 本站友情连接