Oracle预处理查询异常

php中文网
发布: 2016-06-07 17:29:32
原创
1559人浏览过

在工作中发现这样的问题:在Oracle的10g之前的版本,存在一个bug,即用PreparedStatement预处理去动态查询数据时,用占位符?代替

在工作中发现这样的问题:在oracle的10g之前的版本,存在一个bug,即用preparedstatement预处理去动态查询数据时,用占位符?代替的字段,如果是char类型的,那么在执行时用来代替?的变量必须和该字段的长度相同,如果字段长度不足,用空格补充够的位数,否则查询不到正确的结果。如果该字段不是char类型的就不存在这样的问题。

昨天出了一个奇怪的问题,hibernate通过实体Id(char(10)型)取得数据,session.find("from TableName where id=?","value");

取不到数据,但数据库里是有这个条数据。真奇怪,后来用pl/sql看数据库,鼠标点到Id那时,可以看到内容后面还有一些空格,带着期望与质疑把字段里的值自制过来, session.find("from TableName where id=?","value    ");后发现可以。

我特别试了下connection.createStatement("select * from table_name where");

则正常取数据,session.find("from TableName where id=?","value");

而却找不到数据,然后又试了下

ptmt = connection.prepareStatement(select * from table_name where id=?");

ptmt.setString(1,"year");

BlessAI
BlessAI

Bless AI 提供五个独特的功能:每日问候、庆祝问候、祝福、祷告和名言的文本生成和图片生成。

BlessAI 89
查看详情 BlessAI

这样也不行,以是结论是:jdbc驱动PrepareStatement对char字段类型的查找问题,因为hibernate是用PrepareStatement的,自然,hibernate对char对应的属性条件查找出现找不到的情况,

解决办法是:

1.属性用TRIM函数处理:session.find("from TableName where TRIM(id)=?","value");

2.char改为varchar2类型

今天试了下mysql,它不会这样的情况,所以结论是:Oracle JDBC PreparedStatement的bug(有可能它故意这样)

linux

最佳 Windows 性能的顶级免费优化软件
最佳 Windows 性能的顶级免费优化软件

每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号