有这样一段 SQL 代码:
通过 C# 获取查询结果: 
 
SQL 代码中有两个参数,且都是字符串类型,以上的 C# 代码是生成 Oracle SQL 代码所需要的参数。运行结果如下:
 
居然发生这样的错误!苦思冥想外加多次尝试,均无果!
该错误的诡异之处在于:phdLevel 的值为 "%%" 时,运行正常,而为某一状态值(平衡,欠平衡,过平衡) 时,运行出错!如果说 SQL 语句有问题,将上述 SQL 语句参数代入,在 PL/SQL 中运行,一切正常!如果说是 p_phdlevel 的参数有问题,p_company 参数却没有任何问题!两个参数是同样的字符串类型!
 
继续苦苦思索…… 
 
p_company 参数没有问题,那就是说,b.COMPANY = :p_company 这一条件没有问题,也就是说,等号两边的数据类型是一致的!p_phdlevel 有问题,那就是说,a.PHDLEVEL LIKE :p_phdlevel 这一条件有问题,而且从错误信息来看,这一条件存在着 不合理的类型转换(unreasonable conversion)!
 
b.COMPANY 是实体表中的一个字段,类型为 varchar2,p_company 参数也是 varchar2(OracleDbType.Varchar2) 类型!a.PHDLVEL 不是实体表的字段,而是 SELECT 语句生成的字段,其类型是什么?p_phdlevel 参数的类型是 varchar2(OraclDbType.Varchar2)!如此看来,a.PHDLEVEL 的参数必不是 varchar2 类型!也不是 NVarchar2 类型(p_phdlevel 参数类型改成 NVarchar2 类型之后,错误如常)!难道是 Char 类型?将 p_phdlevel 参数类型改成 Char:
 
运行正常!
此时,问题虽然解决了,但并没有消除 Oracle 的诡异:如果说 a.PHDLEVEL 的类型是 Char,导致出错是因为 p_phdlevel 参数的类型错误(Varchar2) ,那为什么在 p_phdlevel 取值为 "%%" 时运行正常,而在取值为中文("欠平衡")时却出错?
可能的解释是:
条件 a.PHDLEVEL LIKE :p_phlevel 存在着一个类型转换:将 Varchar2 类型的 p_phdlevel 参数转换为 Char 类型,这个转换在 p_phdlevel 取值为 "%%" 时,可以正常转换;而当p_phdlevel 取值为中文时,则不能正常转换! 若果如此,则更加令人匪夷所思。Char 是固定长度的字符串类型,而 Varchar2 是可变长度的字符串类型,二者并没有本质区别!
 
笨拙而诡异的 Oracle!  
 

笨拙而诡异的 Oracle的更多相关文章

  1. 笨拙而诡异的 Oracle(之二)

    有一张表,很多数据:   想取某个月的数据.初始的想法很简单,根据日期(RQ)形成条件即可:  符合条件的记录数是 129835,但耗时太长:14.515 秒(RQ字段是做过索引的)!直观的反应是 O ...

  2. Oracle诡异结果调查备忘 - A investigation memo of weird Oracle database search results

    最近需要维护一个差不多十多年前开发的ASP.Net程序,遇到了各种奇奇怪怪的问题,把其中比较难查明的问题记录如下: 问题一: 同样的SQL查询在不同服务器上查询结果不同.在QA环境下,结果完全正常,而 ...

  3. ORACLE关闭启动的诡异错误

    在自己虚拟机搭建的ORACLE数据库环境下,折腾捣鼓做实验时,不知道什么特殊的改动.操作导致从SQL*PLUS里启动数据库实例时,报如下错误: 然后用startup nomout启动时,任然报ORA- ...

  4. ORACLE 博客文章目录(2015-05-27更新)

    从接触ORACLE到深入学习,已有好几年了,虽然写的博客不多,质量也参差不齐,但是,它却是成长的历程的点点滴滴的一个见证,见证了我在这条路上的寻寻觅觅,朝圣的心路历程,现在将ORACLE方面的博客整理 ...

  5. Oracle行转列、列转行的Sql语句总结

    多行转字符串 这个比较简单,用||或concat函数可以实现  SQL Code  12    select concat(id,username) str from app_userselect i ...

  6. Oracle 的字符集与乱码

    字符集问题一直叫人头疼,究其原因还是不能完全明白其运作原理. 在整个运行环节中,字符集在3个环节中发挥作用: 1.软件在操作系统上运作时的对用户的显示,此时采用操作系统定义的字符集进行显示.我们在系统 ...

  7. Delphi编程时候诡异地出现ORA-00937错误,记录解决它的思路和方法

    首先需要说明,这个问题的出现需要几个前提:使用微软的Oracle驱动(使用Oracle自己的驱动不会出现这个问题).使用绑定变量法,使用Format等方式拼接SQL也不会出现这个问题,还有一些诡异的规 ...

  8. SSH框架使用中存在的诡异异常

    背景 相信大多数人目前都在使用Spring + Struts2/SpringMVC + Hibernate来构建项目的整体架构,但是在使用中经藏会遇到一些诡异的问题,不知道如果解决,今天我遇到了一个非 ...

  9. oracle基本操作

    登入oraclesqlplus / as sysdba启动oraclestartup停止oracleshutdown 创建新用户create user username identified by p ...

随机推荐

  1. Java Web学习总结(32)——Java程序员最亲睐的Web框架

    这一次,我们要讨论的是web框架. 只有少数几种语言像Java一样提供了各种各样的web框架,上面的统计图就是一个证据.下面是其他开发者所使用web框架列表: spring MVC/Spring Bo ...

  2. Java MyBatis 插入数据库返回主键--insertSelective这样就不用每次到数据库里面查询了

    insertSelective---Java MyBatis 插入数据库返回主键--insertSelective这样就不用每次到数据库里面查询了 https://www.cnblogs.com/xi ...

  3. POJ 3630

    Phone List Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 20894 Accepted: 6532 Descripti ...

  4. codevs1001 舒适的线路

    题目描述 Description Z小镇是一个景色宜人的地方,吸引来自各地的观光客来此旅游观光.Z小镇附近共有N(1<N≤500)个景点(编号为1,2,3,…,N),这些景点被M(0<M≤ ...

  5. xcode5修改APP名字

    bundle display name 配置文件里面设置, 这个指的是显示在icon下面的名字.application name在itunes connect上改, 是指显示在app store上的名 ...

  6. java编程思想——java IO系统

    一.什么是IO io在本质上是单个字节的移动.而流能够说是字节移动的载体和方式,它不停的向目标处移动数据.我们要做的就是依据流的方向从流中读取数据或者向流中写入数据. 二.java中支持IO操作的库类 ...

  7. keepalived+nginx安装配置

    软件版本号: pcre8.36 ftp://ftp.csx.cam.ac.uk/pub/software/programming/pcre/pcre-8.36.tar.gz keepalived1.2 ...

  8. android电池管理系统

    原文:http://www.2cto.com/kf/201408/326462.html 1.概述 随着移动智能设备的快速发屏,电池的续航能力在很大情况下诱导了大众消费者的购买选择,android系统 ...

  9. ubuntu安装go语言

    1.下载安装包 2.解压 sudo tar -zvxf go1.10.linux-amd64.tar.gz -C /usr/local 3.配置 sudo vim /etc/profile 添加 #s ...

  10. jsp ajax 数据库Demo

    转自:http://blog.csdn.net/rushkid02/article/details/7515058 下面介绍JSP前台表单内容通过Ajax异步提交到后台Servlet进行校验(校验方式 ...