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

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
Oracle 11g数据库使用XML Table的BUG解决

HYPERLINK Oracle 11g开发项目时,使用XML Table出现了BUG,现总结如下:问题其实很简单,就是我们在项目中使用了很多超级长的SQL语句,之后导致SQL执行效率低下,并且貌似导致了Oracle的SQL编译空间溢出了。出问题的SQL:SELECT?N1,N2 ?FROM?A1 ?WHERE ?????(N1=1?AND?N2=a1)?OR ?????(N1=2?AND?N2=a2)?OR ?????(N1=3?AND?N2=a3)?OR ?????(N1=4?AND?N2=a4)?OR ?....?BUG解析当然了真实的SQL文是不可能这么简单的,比这个要复杂的多。不过出问题的部分基本就是这样了,其实原来没用AND/OR这种结构,用的是IN,但IN语句的参数不能超过2000个。所以就改成这个结构了,这个结构传东西到是没有限制了,但是会导致SQL文变长,而且由于数据的长度不定。这些1和a1是前面产生的结果,所以不一定有多少组。所以都是直接拼在SQL里了。问题很明显,后果很严重。BUG解决因为系统已经开发很长时间了,不能进行太大的改动。老系统就这样,改的越多,错的越多,狂改代码基本属于自虐行为。所以我们引入了XMLTable来解决这个问题,这还是一个DBA给的建议呢。SELECT?N1,N2 ?FROM?A1 ?WHERE?(N1,N2)?IN?( ?????SELECT?X1,X2?FROM ?????????XMLTable(for?$i?in?/T/REC?return?$i?PASSING?XMLType(#str:CLOB#) ?????????COLUMNS?X1?INTEGER?PATH?X1, ?????????X2?CHAR(2)?PATH?X2)?因为使用iBatis的缘故,所以我使用了一个叫str的参数,并且声明为CLOB类型的,但str里放什么呢?T?????RECX11/X1X2a1/X2/REC?????RECX12/X1X2a2/X2/REC?????.... ?/T?这个很明白了吧,就是把需要的数据通过XML的形式变成一个表,之后再和主表进行子查询进行关联。这样做的好处就是把SQL文的长度变换为参数的长度了,虽然参数变长了,但SQL文本身变短了。总结真正做的时候还遇到了一些问题:首先,使用这个SQL的时候必须要在一个事务里,虽然他只是查询,但一定要在事务里否则会出错。因为咱们程序里使用了CLOB数据,所以要加载以下的Bean:bean?id=simpleExtractor? ?class=org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor?/bean?bean?id=oracleLobHandler? ?class=org.springframework.jdbc.support.lob.OracleLobHandler?????property?name=nativeJdbcExtractor?ref=simpleExtractor/?/bean?SQLMap里需要加一个CLOB的TypeHandler,之后在变量里声明一下#str:CLOB#就可是了。typeHandler?javaType=java.lang.String?jdbcType=CLOB?? ?callback=org.springframework.orm.ibatis.support.ClobStringTypeHandler/?但还有一点需要注意,我查了很长时间,因为$在iBatis里是关键字,这个关键字如果需要输出的话就需要转义,就要使用$代表一个$当然#也是同理的。来源:网络 编辑:联动北方技术论坛

文档评论(0)

gk892289 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档