Oracle 11g数据库使用XML Table的BUG解决

Oracle 11g开发项目时,使用XML Table出现了BUG,现总结如下:问题其实很简单,就是我们在项目中使用了很多超级长的SQL语句,之后导致SQL执行效率低下,并且貌似导致了Oracle的SQL编译空间溢出了。

出问题的SQL:

  1. SELECT N1,N2  
  2. FROM A1  
  3. WHERE  
  4.     (N1='1' AND N2='a1') OR  
  5.     (N1='2' AND N2='a2') OR  
  6.     (N1='3' AND N2='a3') OR  
  7.     (N1='4' AND N2='a4') OR  
  8. .... 

 

BUG解析

当然了真实的SQL文是不可能这么简单的,比这个要复杂的多。不过出问题的部分基本就是这样了,其实原来没用AND/OR这种结构,用的是IN,但IN语句的参数不能超过2000个。所以就改成这个结构了,这个结构传东西到是没有限制了,但是会导致SQL文变长,而且由于数据的长度不定。这些1和a1是前面产生的结果,所以不一定有多少组。所以都是直接拼在SQL里了。问题很明显,后果很严重。

BUG解决

因为系统已经开发很长时间了,不能进行太大的改动。老系统就这样,改的越多,错的越多,狂改代码基本属于自虐行为。所以我们引入了XMLTable来解决这个问题,这还是一个DBA给的建议呢。

  1. SELECT N1,N2  
  2. FROM A1  
  3. WHERE (N1,N2) IN (  
  4.     SELECT X1,X2 FROM  
  5.         XMLTable('for $i in /T/REC return $i' PASSING XMLType(#str:CLOB#)  
  6.         COLUMNS X1 INTEGER PATH 'X1',  
  7.         X2 CHAR(2) PATH 'X2') 

 

因为使用iBatis的缘故,所以我使用了一个叫str的参数,并且声明为CLOB类型的,但str里放什么呢?

  1. <T> 
  2.     <REC><X1>1</X1><X2>a1</X2></REC> 
  3.     <REC><X1>2</X1><X2>a2</X2></REC> 
  4.     ....  
  5. </T> 

 

这个很明白了吧,就是把需要的数据通过XML的形式变成一个表,之后再和主表进行子查询进行关联。这样做的好处就是把SQL文的长度变换为参数的长度了,虽然参数变长了,但SQL文本身变短了。

总结

真正做的时候还遇到了一些问题:首先,使用这个SQL的时候必须要在一个事务里,虽然他只是查询,但一定要在事务里否则会出错。因为咱们程序里使用了CLOB数据,所以要加载以下的Bean:

  1. <bean id="simpleExtractor"   
  2. class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"> 
  3. </bean> 
  4. <bean id="oracleLobHandler"   
  5. class="org.springframework.jdbc.support.lob.OracleLobHandler"> 
  6.     <property name="nativeJdbcExtractor" ref="simpleExtractor"/> 
  7. </bean> 

 

SQLMap里需要加一个CLOB的TypeHandler,之后在变量里声明一下#str:CLOB#就可是了。

  1. <typeHandler javaType="java.lang.String" jdbcType="CLOB"    
  2. callback="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/> 

 

但还有一点需要注意,我查了很长时间,因为$在iBatis里是关键字,这个关键字如果需要输出的话就需要转义,就要使用$代表一个$当然#也是同理的。

关于Oracle 11g数据库出现使用XML Table解决问题的BUG的解决就介绍到这里了,希望本次的介绍能够对您有所收获!

【编辑推荐】

  1. SQL Server 2008 MDX应用之组装有序集合
  2. SQL Server 2008中的代码安全之主密钥详解
  3. SQL Server 2008 MDX应用之检索集合中的元组
  4. SQL Server 2005/2008中的CTE应用之递归查询
  5. 浅析SQL Server数据库SSIS导入IIS日志的简单步骤

文章来源网络,作者:管理,如若转载,请注明出处:https://shuyeidc.com/wp/277927.html<

(0)
管理的头像管理
上一篇2025-05-11 08:37
下一篇 2025-05-11 08:38

相关推荐

  • 云服务器和云虚拟主机怎么选?云服务器和虚拟主机区别

    云服务器适合业务增长快、需弹性扩展的场景,而云虚拟主机适合预算有限、技术门槛低的小型静态网站或测试环境,二者核心区别在于资源独享性与运维复杂度,核心差异解析:从底层架构到使用体验很多人容易混淆这两者,觉得它们都是“买空间建站”,它们的底层逻辑完全不同,云服务器(ECS)就像是你租了一整栋别墅,水电网络独立,你想……

    2026-06-29
    0
  • 赣州智慧旅游招聘是真的吗?赣州旅游人才招聘信息

    中级岗位(3-5年经验)月薪范围通常在6000-10000元,这类岗位需要独立负责项目模块,如独立运营一个抖音账号,或维护一个景区小程序的功能迭代,具备成功案例的候选人议价能力较强,高级岗位(5年以上经验)月薪范围通常在10000-20000元,部分核心管理岗可达更高,这类人才需要具备战略规划能力,如制定整个景……

    2026-06-29
    0
  • 赣州智能物联网车位锁如何管理?智能车位锁管理系统多少钱

    赣州智能物联网车位锁管理的核心在于通过云端平台实现远程控锁、状态实时监控及自动计费,彻底解决传统车位“被占难管”与“找位难”的痛点,在赣州这样的城市,随着机动车保有量的持续增长,老旧小区、商业综合体以及私人固定车位的资源矛盾日益凸显,传统的机械地锁或简易遥控锁,不仅操作繁琐,更无法实现数据化管理,引入智能物联网……

    2026-06-29
    0
  • 赣州智能消防栓好用吗,智能消防栓多少钱一个

    赣州智能消防栓通过物联网技术实现实时监测与远程报警,能显著降低火灾响应时间并提升城市消防安全管理水平,是目前智慧城市建设中不可或缺的基础设施,赣州智能消防栓的核心价值与应用场景传统消防栓往往存在“看不见、摸不着、用不了”的痛点,在赣州这样地形复杂、老城区与新城区并存的区域,传统设施的管理难度极大,智能消防栓的出……

    2026-06-29
    0
  • 云服务器和物理机到底有啥区别?

    云服务器本质上是虚拟化资源池中的弹性实例,而传统物理服务器是独占的硬件实体,前者胜在弹性与运维便捷,后者强在物理隔离与性能稳定,具体选择取决于业务对成本、扩展性及安全合规的权衡,很多人初次接触服务器时,容易把“云服务器”和“传统物理服务器”混为一谈,觉得它们都是用来跑网站或存数据的盒子,这两者的底层逻辑完全不同……

    2026-06-29
    0

发表回复

您的邮箱地址不会被公开。必填项已用 * 标注