日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Oracle11g數(shù)據(jù)庫使用XMLTable的BUG解決

Oracle 11g開發(fā)項目時,使用XML Table出現(xiàn)了BUG,現(xiàn)總結(jié)如下:問題其實很簡單,就是我們在項目中使用了很多超級長的SQL語句,之后導(dǎo)致SQL執(zhí)行效率低下,并且貌似導(dǎo)致了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解析

當(dāng)然了真實的SQL文是不可能這么簡單的,比這個要復(fù)雜的多。不過出問題的部分基本就是這樣了,其實原來沒用AND/OR這種結(jié)構(gòu),用的是IN,但IN語句的參數(shù)不能超過2000個。所以就改成這個結(jié)構(gòu)了,這個結(jié)構(gòu)傳東西到是沒有限制了,但是會導(dǎo)致SQL文變長,而且由于數(shù)據(jù)的長度不定。這些1和a1是前面產(chǎn)生的結(jié)果,所以不一定有多少組。所以都是直接拼在SQL里了。問題很明顯,后果很嚴(yán)重。

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.  
  2.     1a1 
  3.     2a2 
  4.     ....  
  5.  

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

總結(jié)

真正做的時候還遇到了一些問題:首先,使用這個SQL的時候必須要在一個事務(wù)里,雖然他只是查詢,但一定要在事務(wù)里否則會出錯。因為咱們程序里使用了CLOB數(shù)據(jù),所以要加載以下的Bean:

 
 
 
  1. class="org.springframework.jdbc.support.nativejdbc.SimpleNativeJdbcExtractor"> 
  2.  
  3. class="org.springframework.jdbc.support.lob.OracleLobHandler"> 
  4.      
  5.  

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

 
 
 
  1. callback="org.springframework.orm.ibatis.support.ClobStringTypeHandler"/> 

但還有一點需要注意,我查了很長時間,因為$在iBatis里是關(guān)鍵字,這個關(guān)鍵字如果需要輸出的話就需要轉(zhuǎn)義,就要使用$代表一個$當(dāng)然#也是同理的。

關(guān)于Oracle 11g數(shù)據(jù)庫出現(xiàn)使用XML Table解決問題的BUG的解決就介紹到這里了,希望本次的介紹能夠?qū)δ兴斋@!

【編輯推薦】

  1. SQL Server 2008 MDX應(yīng)用之組裝有序集合
  2. SQL Server 2008中的代碼安全之主密鑰詳解
  3. SQL Server 2008 MDX應(yīng)用之檢索集合中的元組
  4. SQL Server 2005/2008中的CTE應(yīng)用之遞歸查詢
  5. 淺析SQL Server數(shù)據(jù)庫SSIS導(dǎo)入IIS日志的簡單步驟

名稱欄目:Oracle11g數(shù)據(jù)庫使用XMLTable的BUG解決
文章分享:http://www.dlmjj.cn/article/dhdpphi.html