Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1151313
  • 博文数量: 166
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 3760
  • 用 户 组: 普通用户
  • 注册时间: 2011-03-30 13:00
个人简介

About me:Oracle ACE pro,optimistic,passionate and harmonious. Focus on ORACLE,MySQL and other database programming,peformance tuning,db design, j2ee,Linux/AIX,Architecture tech,etc

文章分类

全部博文(166)

文章存档

2024年(18)

2023年(28)

2022年(43)

2020年(62)

2014年(3)

2013年(9)

分类: Oracle

2022-04-10 21:14:24

decode函数很多人经常使用,但是搞清楚里面到底有什么规则,估计知道的人就少了,所以经常冒出这样那样的问题,
不光decode,其他函数都有类似问题,下面写的东西,希望能为大家学习oracle,研究文档提供一点参考和思路,学习一门技术,
首先要看的就是文档,怎么看文档,比如函数吧,要看函数的作用范围,使用场合,函数的参数和返回值规则,函数的一系列限制等,
然后自己写几个例子,自然对函数有更深刻的认识,decode函数使用报错经常发生,看完下面的东西我想decode函数使用应该没有什么问题了,
只局限于语法使用,那些灵活的应用就不说了。


原帖:http://www.itpub.net/thread-1375121-1-1.html
ora-01861 有时出现,有时不出现

在我们的一个程序里,“ora-01861 文字与格式字符串不匹配”有时候会出现,有时候又不会。传入程序的参数都是一样的……
请问各位高手,这种随机性的错误怎么跟踪啊?

但是有时我运行一次报错,再运行一次,同样的参数,又没错了……

另外,还想问下
为什么select decode(1,2,null,to_date('2010/12/07','YYYY/MM/DD'))查出来的格式和select decode(1,1,to_date('2010/12/07','YYYY/MM/DD'))不同呢?



使用函数一定要看清楚文档上描述的使用范围,方式以及限制,注意函数参数类型和返回值类型规则,文档中的描述是:
1.decode(expr,search,result....default)首先看第1个expr,search是字符类型的话,然后看第1个result,所有的result必须与第1个result类型一致,不一致则自动转换(也遵守第2点短路规则),这个过程就有可能出错了。如果第1个expr-search是数值类型或日期类型也一样。

2.oracle计算expr与search的比较是通过短路比较的,比如第1个expr-search对匹配上了,后面的就不比较了。但是如果没有匹配上,则会继续匹配第2对...直到完毕,这个说明假设前面一对匹配上,则后面的expr-search就算类型不一致,也不用转换,否则还要转换为与第1对expr-search类型一致,这个又可能会出错。其中expr-search之间的类型转换是自动转为和第1次出现的search类型一致,因此匹配到什么地方,expr_search的类型就与第1次出现的search类型一致,result运算到什么地方就与第1次出现的result类型一致。

3.如果第1个result是null,所有返回值类型转为varchar2,search一样

-----------------------------------------------example-----------------------------------------------------

第1点例子:
--可以看出default result 0转为了字符串,因为字符串显示是左对齐,和第1个result 'x'类型一致
DINGJUN123>select decode(1,2,'x',0) x from dual;

X
--
0

已选择 1 行。

DINGJUN123>select 0 x from dual;

         X
----------
         0

已选择 1 行。


--转换不成功,出错

DINGJUN123>select decode(1,2,1,'x') x from dual;
select decode(1,2,1,'x') x from dual
                    *
第 1 行出现错误:
ORA-01722: 无效数字



第2点例子:
--因为第1对expr-search匹配上了,后面的expr-search就不用管了,所以没有问题

DINGJUN123>select decode(1,1,1,'x','x',0) x from dual;
         X
----------
         1

已选择 1 行。

--第1对没有匹配上,第2对要转为和第1对expr-search类型一致,'x'转为不了数值,出错
DINGJUN123>select decode(1,2,1,'x','x',0) x from dual;
select decode(1,2,1,'x','x',0) x from dual
                    *
第 1 行出现错误:
ORA-01722: 无效数字


--result短路

DINGJUN123>select decode(1,2,1,0,0,'y') x from dual;
select decode(1,2,1,0,0,'y') x from dual
                        *
第 1 行出现错误:
ORA-01722: 无效数字


DINGJUN123>select decode(1,1,1,0,0,'y') x from dual;
         X
----------
         1

已选择 1 行。


DINGJUN123>select decode(1,1,1,0,0,'0') x from dual;
         X
----------
         1

已选择 1 行。

--expr与search类型不一致,则转为与第1次的search类型一致

DINGJUN123>select decode('1',2,1,'x','x','0') x from dual;
select decode('1',2,1,'x','x','0') x from dual
                      *
第 1 行出现错误:
ORA-01722: 无效数字


DINGJUN123>select decode(1,'2',1,'x','x','0') x from dual;
         X
----------
         0

已选择 1 行。

第3点例子:

--如果第1个result是null,则匹配到的result转为varchar2
DINGJUN123>select decode(1,'2',null,'x','x',0) x from dual;

X
--
0

已选择 1 行。


--第1个search是null,匹配到的expr-search也转为null
DINGJUN123>select decode(1,null,null,'x','x',0) x from dual;
X
--
0

已选择 1 行。


你的问题:根据上面规则,第1个返回值是varchar2,第2个返回值是date,为什么显示一样呢?因为date显示出来会根据nls_date...参数自动转换的
因此,返回值类型不一致,在客户端显示一致,想证明很简单:

DINGJUN123>select decode(1,2,null,to_date('2010/12/07','YYYY/MM/DD')) x from dual;
X
----------------------
07-12月-10

已选择 1 行。



DINGJUN123>select decode(1,1,to_date('2010/12/07','YYYY/MM/DD')) from dual;
DECODE(1,1,TO_
--------------
07-12月-10

已选择 1 行。

证明它们的返回值类型不一致如下:

--因为返回值是'07-12月-10',做不了加法运算

DINGJUN123>select decode(1,2,null,to_date('2010/12/07','YYYY/MM/DD'))+1 x from dual;
select decode(1,2,null,to_date('2010/12/07','YYYY/MM/DD'))+1 x from dual
       *
第 1 行出现错误:
ORA-01722: 无效数字


--返回值是date,当然能做加法运算了

DINGJUN123>select decode(1,1,to_date('2010/12/07','YYYY/MM/DD'))+1 from dual;

DECODE(1,1,TO_
--------------
08-12月-10

已选择 1 行。

阅读(373) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~