成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Oracle 11g數(shù)據(jù)庫使用XML Table的BUG解決

數(shù)據(jù)庫 Oracle
本文我們主要介紹了在Oracle 11g的環(huán)境下使用XML Table出現(xiàn)了BUG現(xiàn)象,從而造成SQL編譯空間溢出的問題的解決過程,希望能夠對您有所幫助。

Oracle 11g開發(fā)項目時,使用XML Table出現(xiàn)了BUG,現(xiàn)總結如下:問題其實很簡單,就是我們在項目中使用了很多超級長的SQL語句,之后導致SQL執(zhí)行效率低下,并且貌似導致了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語句的參數(shù)不能超過2000個。所以就改成這個結構了,這個結構傳東西到是沒有限制了,但是會導致SQL文變長,而且由于數(shù)據(jù)的長度不定。這些1和a1是前面產(chǎn)生的結果,所以不一定有多少組。所以都是直接拼在SQL里了。問題很明顯,后果很嚴重。

BUG解決

因為系統(tǒng)已經(jīng)開發(fā)很長時間了,不能進行太大的改動。老系統(tǒng)就這樣,改的越多,錯的越多,狂改代碼基本屬于自虐行為。所以我們引入了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的參數(shù),并且聲明為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> 

 

這個很明白了吧,就是把需要的數(shù)據(jù)通過XML的形式變成一個表,之后再和主表進行子查詢進行關聯(lián)。這樣做的好處就是把SQL文的長度變換為參數(shù)的長度了,雖然參數(shù)變長了,但SQL文本身變短了。

總結

真正做的時候還遇到了一些問題:首先,使用這個SQL的時候必須要在一個事務里,雖然他只是查詢,但一定要在事務里否則會出錯。因為咱們程序里使用了CLOB數(shù)據(jù),所以要加載以下的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數(shù)據(jù)庫出現(xiàn)使用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數(shù)據(jù)庫SSIS導入IIS日志的簡單步驟
責任編輯:趙鵬 來源: 博客園
相關推薦

2009-11-19 17:28:43

Oracle數(shù)據(jù)庫11

2011-06-15 10:10:17

Oracle11g

2009-05-21 10:20:54

Oracle 11g數(shù)據(jù)衛(wèi)士備用數(shù)據(jù)庫

2011-08-22 14:50:20

2011-08-22 14:37:33

2010-05-05 17:06:31

Oracle 11g

2011-08-22 14:19:31

Oracle 11g 示例用戶

2009-08-12 10:54:54

2011-03-31 10:38:49

Oracle數(shù)據(jù)庫

2011-03-25 11:32:46

Oracle數(shù)據(jù)庫11gTPC-H測試

2009-07-08 00:24:00

數(shù)據(jù)壓縮Oracle 11g

2009-11-20 12:55:08

Oracle 11g功

2010-04-07 17:27:38

Oracle 11g

2009-09-15 09:52:25

Oracle 11g分

2011-08-19 09:11:24

Oracle 11g回啟動閃回數(shù)據(jù)庫

2009-04-15 09:49:20

2012-05-07 13:45:45

Oraclen 11g虛擬列數(shù)據(jù)庫

2010-04-01 15:19:56

Oracle 11g壓

2011-04-15 09:11:21

2010-04-13 15:56:03

Oracle 11g
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 亚洲成人免费视频在线 | 中文字幕在线欧美 | 国产黄色在线观看 | 欧洲一级视频 | 91在线电影 | 日韩久久久一区二区 | 日本一区二区三区四区 | 色av一区| 欧美一区二区久久 | 国产精品视频 | 干干干日日日 | 人人干人人干人人 | 精品欧美一区二区三区久久久 | 久久久久久成人 | 亚洲成人精品免费 | 龙珠z国语版在线观看 | 免费在线观看av网址 | 久久综合九色综合欧美狠狠 | 亚洲精品一区二区三区在线 | 91麻豆蜜桃一区二区三区 | a免费视频 | 国久久 | 色男人的天堂 | 一区二区三区在线观看视频 | 在线午夜 | 一区二区三区在线看 | 精品少妇一区二区三区日产乱码 | 国产精品视频97 | 国产高清免费 | 在线播放中文字幕 | 日韩成人在线播放 | 欧美日韩精品 | 国产精品无码专区在线观看 | 一区二区福利视频 | 午夜精品福利视频 | 亚洲精品黄 | 欧美精品久久久 | 午夜免费 | 日韩av一区二区在线观看 | 狠狠操狠狠操 | 日本久久综合网 |