引起语句多版本的一个原因。下面做了一个测试来演示这种情况,线上很多库上都有类似的问题。
ibatis版本:2.3.0
oracle版本:10.2.0.4
1. 建临时表
create table tmp_jd_bind_test(id number, c1 number, c2 date);
2. java 端调用程序,用ibatis, 插入记录, 这一步是雷卷配合帮忙做的,非常感谢雷卷
<insert id="SkinDAO.insertCheck" parameterClass="java.util.Map">
insert into tmp_jd_bind_test(id, c1, c2) values(#id#, #c1#, #c2#)
</insert>
public void testCheck() throws Exception {
Map<String, Object> params = new HashMap<String, Object>();
params.put("id", 1);
skinDAO.insertCheck(params);
params.put("c1", 0);
skinDAO.insertCheck(params);
params.put("c2", new Date());
skinDAO.insertCheck(params);
params.remove("id");
skinDAO.insertCheck(params);
params.remove("c1");
skinDAO.insertCheck(params);
}
3. 看表里的数据
SQL> select * from tmp_jd_bind_test;
ID C1 C2
---------- ---------- ------------
1
1 0
1 0 12-JAN-10
0 12-JAN-10
12-JAN-10
4. 找到刚才执行的insert语句的sql_id --sql_id: aq45j8c82fg6n
aq45j8c82fg6n
insert into tmp_jd_bind_test(id, c1, c2) values(:1, :2, :3)
5. 看这个sql_id的多个子游标
SQL> select sql_id, child_address, child_number from v$sql where sql_id = 'aq45j8c82fg6n';
SQL_ID CHILD_ADDRESS CHILD_NUMBER
------------- ---------------- ------------
aq45j8c82fg6n 00000000B57BAEF8 0
aq45j8c82fg6n 00000000A5D45A28 1
aq45j8c82fg6n 00000000A5ADAD48 2
aq45j8c82fg6n 00000000B57A29E8 3
aq45j8c82fg6n 00000000924298F0 4
6. 查看这些子游标的绑定变量情况
SQL> select * from v$sql_bind_metadata where address in ('00000000B57BAEF8', '00000000A5D45A28', '00000000A5ADAD48', '00000000B57A29E8', '00000000924298F0') order by position, address;
ADDRESS POSITION DATATYPE MAX_LENGTH ARRAY_LEN BIND_NAME
---------------- ---------- ---------- ---------- ---------- ------------------------------
00000000924298F0 1 1 32 0 1
00000000A5ADAD48 1 2 22 0 1
00000000A5D45A28 1 2 22 0 1
00000000B57A29E8 1 1 32 0 1
00000000B57BAEF8 1 2 22 0 1
00000000924298F0 2 1 32 0 2
00000000A5ADAD48 2 2 22 0 2
00000000A5D45A28 2 2 22 0 2
00000000B57A29E8 2 2 22 0 2
00000000B57BAEF8 2 1 32 0 2
00000000924298F0 3 180 11 0 3
00000000A5ADAD48 3 180 11 0 3
00000000A5D45A28 3 1 32 0 3
00000000B57A29E8 3 180 11 0 3
00000000B57BAEF8 3 1 32 0 3
15 rows selected.
7. 总结一下规律
如果表里字段是number型的,用ibatis传一个null进来,会绑定成varchar2类型的,
如果表里字段是date型的,用ibatis传一个null进来,也会绑定成varchar2类型的。
8. 怎么解决这个问题?
这是接下来要考虑问题。
<insert id="SkinDAO.insertCheck" parameterClass="java.util.Map">
insert into tmp_jd_bind_test(id, c1, c2) values(#id#, #c1#, #c2#)
</insert>
这种写法容易导致多版本, 当传入的值为null时,ibatis不能判断出字段的类型
<insert id="SkinDAO.insertCheck" parameterClass="java.util.Map">
insert into tmp_jd_bind_test(id, c1, c2) values(#id:BIGINT#, #c1:BIGINT#, #c2:DATE#)
</insert>
通过在sqlmap文件中指定每个字段的类型,不会产生由于类型不匹配引起的多版本
分享到:
相关推荐
许多年来,我在不同的新闻组上花费了很多时间与那些想知道如何得到数据库管理员(DBA)的工作或者如何成长为一名DBA的IT人进行交谈,现在他们有了工作。这些年来许多人针对如何达到这个目标提出了不同意见。本文即是...
Oracle_DBA突击__帮你赢得一份DBA职位
DBA职业是一个非常具有前景的职业, DBA的薪水往往很高,且工作机会非常多。 此外,DBA职业规划还需要了解DBA职业的发展方向。DBA职业的发展方向包括数据库管理、云计算、大数据、人工智能等领域。 DBA需要不断学习...
DBA职责(岗位说明书) 数据库管理员(Database Administrator,简称 DBA)是负责管理和维护数据库服务器的关键人物,主要职责包括确保服务器工作状态正常、检查硬盘空间、查看日志和跟踪文件、检查备份的有效性、...
DBA面试题 Oracle 本文总结了 Oracle 数据库管理员(DBA)面试中的一些重要知识点,从表连接方式、执行计划、CBO 和 RBO、SQL 调整、索引、绑定变量、执行计划、排序等方面进行了详细的解释。 一、表连接方式 在 ...
作者本人不仅专业技术过硬,还当过篮球教练,对人生,尤其是DBA 的生存之道有很独到的领悟... 本书汇集了作者有关数据库管理的真知灼见,讲述了DBA 的方方面面,有技术的,还有生活的。作者本人不仅专业技术过硬,还...
【DBA职业生涯】是IT行业中一个独特且重要的领域,涵盖了数据库的管理、优化、安全以及故障排除等多个方面。本文由资深DBA Brian Peasland撰写,他分享了自己的职业发展历程,从计算机操作人员到DBA的成长经历,为...
在Oracle数据库中,系统角色是预定义的一组权限集合,它们为数据库管理员(DBA)提供了方便的方式来管理和分配权限。DBA角色是最具权限的角色之一,通常赋予那些负责数据库全面管理的用户。当误删除了这个关键角色时...
其中包含了自己经历的一份面试笔试题(很难得),还有一些工作经验,总共5份文档,有一点点文件是转载的~~
Oracle DBA 入门、进阶学习路线图参考 Oracle DBA 入门、进阶学习路线图参考是一个详细的学习路线图,旨在帮助新手 DBA 学习 Oracle 数据库管理系统。该路线图由经验丰富的 DBA eygle 根据自己的学习经历和经验总结...
数据库管理员(Database Administrator,DBA)是信息技术领域中至关重要的角色,主要负责组织的数据管理和维护。DBA的工作职责广泛,涵盖了数据库的安装、升级、设计、安全、性能优化、备份与恢复等多个方面。 首先...
运维DBA(数据库管理员)是负责数据库系统日常运维工作的专业人员。他们对数据库的性能、稳定性和安全性进行监控、调整和优化,以确保企业数据的高可用性和一致性。运维DBA的重要性体现在以下几个方面: 1. 数据库...
DBA 职责及日常工作职责 DBA 职责是数据库管理员的职责,负责数据库系统的日常维护、监控和管理。DBA 的日常工作职责包括安装和升级数据库服务器、创建数据库存储结构、管理数据库用户、控制和监控用户对数据库的...
以下是对标题“最有用的DBA视图”及其描述中提到的关键知识点的详细解析: ### dba_data_files `dba_data_files`视图包含了数据库文件的详细信息,包括文件名、文件路径、文件大小、当前使用量、最大大小等。这有...
MySQL DBA(数据库管理员)在日常工作中经常需要执行各种脚本来进行数据库的管理和维护工作。这些脚本涵盖了从数据备份、恢复、性能优化到错误排查等多个方面。以下是一些MySQL DBA常用的知识点,结合“mysql_mgr_...
DBA 常用命令集锦 DBA(Database Administrator)是数据库管理员的简称,负责数据库的日常管理、维护和优化。DBA 需要掌握大量的命令和技术来完成日常工作。下面是 DBA 常用的命令集锦,包括连接数据库、查看用户...
《DBA日记--署名》是一本记录了数据库管理员(DBA)日常工作与学习历程的书籍,作者以“白鳝”的身份分享了他的经验与感悟。这本书以其生动的叙述和丰富的技术内容,吸引了对Oracle数据库管理有兴趣的读者。通过日记的...
Oracle DBA工作手记中提到的DBA2.0是Oracle数据库管理员领域的一次重要概念革新,这一概念在2008至2009年间伴随着Oracle Database 10g的成熟和11g版本的推行而正式提出。DBA2.0不只是一个简单的概念,而是在长期实践...
### Oracle 创建 DBA 用户知识点详解 #### 一、Oracle 创建 DBA 用户背景介绍 在 Oracle 数据库管理系统中,为了确保数据的安全性和管理的有效性,通常会根据不同的需求为不同的用户分配不同的权限。其中,DBA...
Oracle dba常用操作,很基础很详细。