交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配varchar2转化为nvarchar2字符缺失case when else后的字符类型要一致

Posted 疯子加天才

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配varchar2转化为nvarchar2字符缺失case when else后的字符类型要一致相关的知识,希望对你有一定的参考价值。

在做交叉报表列头的排序时,遇到这三个问题,下面具体来说一下。

设计的数据库的表结构如图1所示:

图1

要处出来student_name_,s.grade_,s.subject_name_,这三个属性,当时我是这样写的sql语句:

select  s.student_name_, s.grade_,  s.subject_name_,

case  s.subject_name_

when  \'语文\' then \'A语文\' 

when  \'数学\' then \'B数学\' 

when  \'英语\' then \'C英语\'

else  s.subject_name_

end

from student s

执行之后报如图2的错误:

图2

后来发现出错的原因在于:subject_name_是nvarchar2类型的所以,‘’中的汉字是varchar2类型的,所以要把‘’中的汉字都转化为nvarchar2类型,于是将sql语句改成如下所示:

select  s.student_name_, s.grade_, s.subject_name_,

case s.subject_name_

when  cast(\'语文\'as  nvarchar2(10))  then cast(\'A语文\'asnvarchar2(10))

when  cast(\'数学\'as  nvarchar2(10))  then cast(\'B数学\'asnvarchar2(10))

when  cast(\'英语\'as  nvarchar2(10))  then cast(\'C英语\'asnvarchar2(10))

else  s.subject_name_

end

from student s

但是,运行之后效果不是我想的那样!结果如图3所示:

图3

很奇怪,“语文”和“数学”都很正常,英语就不正常!再执行语句

select  cast(\'英语\' as  nvarchar2(10))  from student s  where s.subject_name_ =\'英语\'

结果是这样的,如图4所示:

图4

也就是 varchar2在向nvarchar2转化的时候造成了字符丢失,在找解决办法的时候在看到这篇文章http://blog.csdn.net/tobeistdo/article/details/5610287,才知道应该用to_char函数来进行varchar2与 nvarchar2的类型转换。于是,就又改成这样写了:

select s.student_name_,s.grade_,s.subject_name_,

case s.subject_name_

when to_char(\'语文\')  then to_char(\'A语文\')

when to_char(\'数学\')  then to_char(\'B数学\')

when to_char(\'英语\')  then to_char(\'C英语\')

else  s.subject_name_

end  as other_name_

from student s

结果,还是报错,如图5所示,还是字符集不匹配:

图5

查了很多牛人写的资料才知道:case的用法中when与else后的字符类型必须一致,但是这样还是不行,再把case后的字符类型改成与when、else后的字符类型一致才算ok,即:

select  s.student_name_,s.grade_,s.subject_name_,

case  to_char(s.subject_name_)

when to_char(\'语文\')  then to_char(\'A语文\')

when to_char(\'数学\')  then to_char(\'B数学\')

when to_char(\'英语\')  then to_char(\'C英语\')

else  to_char(s.subject_name_)

end  as other_name_

from student s

最终如图6所示:

图6

 
0

以上是关于交叉报表列头排序时遇到的oracle问题—oracle ORA-12704:字符集不匹配varchar2转化为nvarchar2字符缺失case when else后的字符类型要一致的主要内容,如果未能解决你的问题,请参考以下文章

Oracal数据库安装配置教程

WPF报表自定义通用可筛选列头-WPF特工队内部资料

C# winform 中datagridview ,如何实现点击列头,对应的列自动排序。

Devart Oracle 交叉应用异常

关于oracle和mysql数据库的查询问题

gridcontrol的列头右键菜单问题