网站首页
JSP空间
动态资讯
开源项目
技术文档
资源下载
J2EE资源
客户论坛
在线支付
 
  技术文档>>数据库技术>>Oracle技术>>Oracle开发>查看文档  
  如何判断一个字符串的内容是否是数值     
  文章作者:未知  文章来源:赛迪网技术社区  
  查看:81次  录入:管理员--2008-04-03  
 

【赛迪网-it技术报道】问题:判断一个字符串的内容是否是数值。

解决方法:利用oracle数据库自带的to_number函数(增加了异常处理部分,防止非数字类型导致函数异常而中断执行)。

sql> create or replace function f_is_num(p_num in varchar2) return varchar2 as

2 v_tmp number;

3 begin

4 if p_num is null then

5 return null;

6 end if;

7 v_tmp := to_number(p_num);

8 return 't';

9 exception

10 when others then

11 return 'n';

12 end;

13 /

函数已创建。

sql> create or replace function f_is_num1(p_num in varchar2) return varchar2 as

2 v_num_dot number default 0;

3 begin

4 if p_num is null then

5 return null;

6 end if;

7 for i in 1..length(p_num) loop

8 case substr(p_num, i, 1)

9 when '0' then null;

10 when '1' then null;

11 when '2' then null;

12 when '3' then null;

13 when '4' then null;

14 when '5' then null;

15 when '6' then null;

16 when '7' then null;

17 when '8' then null;

18 when '9' then null;

19 when '.' then

20 v_num_dot := v_num_dot + 1;

21 if v_num_dot > 1 then

22 return 'n';

23 end if;

24 when '-' then

25 if i != 1 then

26 return 'n';

27 end if;

28 when '+' then

29 if i != 1 then

30 return 'n';

31 end if;

32 else return 'n';

33 end case;

34 end loop;

35 return 't';

36 end;

37 /

函数已创建。

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 行。

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> commit;

提交完成。

sql>

sql> col num_str format a12

sql> col is_num format a6

sql> select num_str, f_is_num(num_str) is_num from t;

num_str is_num

------------ ------

-5 t

2.2342 t

+123.1234 t

-5-34 n

1230234j342 n

5.524.2 n

已选择6行。

sql> select num_str, f_is_num1(num_str) is_num from t;

num_str is_num

------------ ------

-5 t

2.2342 t

+123.1234 t

-5-34 n

1230234j342 n

5.524.2 n

已选择6行。

采用第二种方法在处理较大数据量且其中大部分为非数字类型的数据时,效率较高。

sql> set autot trace stat

sql> set timing on

sql> select f_is_num(object_id) from dba_objects;

已选择6291行。

已用时间: 00: 00: 00.04

statistics

----------------------------------------------------------

7 recursive calls

0 db block gets

4809 consistent gets

0 physical reads

0 redo size

82590 bytes sent via sql*net to client

5112 bytes received via sql*net from client

421 sql*net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

6291 rows processed

sql> select f_is_num(object_id) from dba_objects;

已选择6291行。

已用时间: 00: 00: 00.04

statistics

----------------------------------------------------------

0 recursive calls

0 db block gets

4807 consistent gets

0 physical reads

0 redo size

82590 bytes sent via sql*net to client

5112 bytes received via sql*net from client

421 sql*net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

6291 rows processed

sql> select f_is_num1(object_id) from dba_objects;

已选择6291行。

已用时间: 00: 00: 00.04

statistics

----------------------------------------------------------

7 recursive calls

0 db block gets

4809 consistent gets

0 physical reads

0 redo size

82591 bytes sent via sql*net to client

5112 bytes received via sql*net from client

421 sql*net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

6291 rows processed

sql> select f_is_num1(object_id) from dba_objects;

已选择6291行。

已用时间: 00: 00: 00.04

statistics

----------------------------------------------------------

0 recursive calls

0 db block gets

4807 consistent gets

0 physical reads

0 redo size

82591 bytes sent via sql*net to client

5112 bytes received via sql*net from client

421 sql*net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

6291 rows processed

假如输入的参数以数字类型为主,则两者效率差不多。

假如输入的参数大部分无法转化为数字类型,则第二种方法的效率会更高。

sql> select f_is_num(object_name) from dba_objects;

已选择6291行。

已用时间: 00: 00: 00.08

statistics

----------------------------------------------------------

7 recursive calls

0 db block gets

4809 consistent gets

0 physical reads

0 redo size

82591 bytes sent via sql*net to client

5112 bytes received via sql*net from client

421 sql*net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

6291 rows processed

sql> select f_is_num(object_name) from dba_objects;

已选择6291行。

已用时间: 00: 00: 00.07

statistics

----------------------------------------------------------

0 recursive calls

0 db block gets

4807 consistent gets

0 physical reads

0 redo size

82591 bytes sent via sql*net to client

5112 bytes received via sql*net from client

421 sql*net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

6291 rows processed

sql> select f_is_num1(object_name) from dba_objects;

已选择6291行。

已用时间: 00: 00: 00.04

statistics

----------------------------------------------------------

7 recursive calls

0 db block gets

4809 consistent gets

0 physical reads

0 redo size

82592 bytes sent via sql*net to client

5112 bytes received via sql*net from client

421 sql*net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

6291 rows processed

sql> select f_is_num1(object_name) from dba_objects;

已选择6291行。

已用时间: 00: 00: 00.04

statistics

----------------------------------------------------------

0 recursive calls

0 db block gets

4807 consistent gets

0 physical reads

0 redo size

82592 bytes sent via sql*net to client

5112 bytes received via sql*net from client

421 sql*net roundtrips to/from client

0 sorts (memory)

0 sorts (disk)

6291 rows processed

假如不采用to_number而是使用对字符串中每个字符依次判断的方法,则会增加复杂的程度。

 
 
上一篇: 轻松掌握oralce数据库常用预定义的例外    下一篇: 指定一个where条件来有条件地导出记录
  相关文档
dml操作update和delete时产生的锁示例 (1) 04-07
实例讲解分区表的可用性及相关错误案例 (1) 03-31
轻松接触分布式数据库全局名与数据库链 01-24
oracle利用传输表空间导出导入数据的步骤 (1) 03-19
快速解决"oracle"数据库中的常见问题 (1) 03-17
oracle数据库中管理表空间和数据文件 (1) 04-24
oracle数据库索引聚簇与哈希聚簇使用指南 05-05
解析:job的interval输入参数过长的问题 11-15
用最简单的方法复制或迁移oracle数据库 05-13
如何正确的使用or展开来改写sql查询 03-26
Oracle专家调优秘密 01-15
解析:Oracle数据库最大可用性体系结构 09-01
经验谈之项目中的Oracle开发技巧 05-13
讲解linux环境下oracle的自动启动与停止 03-31
Oracle中如何实现某一字段自动增加1 01-15
为什么同机安装10g和11g后会出现连接问题 04-17
使用impdp复制oracle的schema数据迁移 05-14
oracle10g r2 emca常用命令及实例步骤 07-25
利用Oracle的管理服务器将数据导入导出 06-10
通过db查询的两个数据库间scn会被同步 03-26
返回首页 | 关于我们 | J网章程 | JSP空间合租 | 客服中心 | 免责声明 | 常见问题 | 参观机房
本站主机空间代理至厦门市华众网络科技有限公司
《中华人民共和国增值电信业务经营许可证》
编号:闽B2-20050079
@2005-2008福建JSP技术网 版权所有 闽ICP备05000928号
厦门(总部):13616026886 福州:0591-87655121
邮箱:admin@fjjsp.com 站长QQ,点击这里给我发消息