2012-08-22 74 views
2

我有一個PL/SQL函數來從MySQL複製GROUP_CONCAT()。該函數接受一個CURSOR並返回一個VARCHAR2。但是,我的應用程序中有一些對象具有足夠的數據,以致連接字符串的大小大於4000.由於我在SELECT語句(而不僅僅是PL/SQL)中使用了此函數,這使Oracle生氣並拋出了一個ORA -06502。PL/SQL返回CLOB和JDBC性能

所以,我改變了函數來返回一個CLOB。這需要處理錯誤,但使用JDBC讀取數據時,性能會受到嚴重影響。我正在讀取大量數據,並從VARCHAR2切換到CLOB導致執行時間縮短10-20倍。我一直在尋找優化這種方式,但由於CLOB是從一個函數返回,不在表​​中,我讀過的大部分是不適用的。

有什麼辦法可以改善嗎?我想強調這與實際數據庫的性能無關;連接4000個字符的值非常快,只有少數對象需要超過這個值,而最大值大約爲5000個字符。 LOB通常針對大型原始數據進行了優化,如果不是針對SELECT語句中存在的列的Oracle大小限制,我不需要這樣做。

編輯 - 我想重申的是,CLOB是在一個函數創建,它不是讀數據庫中的任何的CLOB。它只是簡單地連接VARCHAR2s並將結果作爲CLOB返回。

+0

你是如何找回數據的?可能也想看看這個:http://docs.oracle.com/cd/B19306_01/appdev.102/b14249/adlob_performance.htm – Mike

+0

我得到單個行中每個對象的所有數據。這就是我將值連接起來而不是隻讀多行的原因。一切都很好,直到我發現某些對象在其中一個連接列中有4000個以上的字符。這個Oracle文檔在這種情況下並不是非常有用,因爲我從一個函數創建CLOB僅僅是因爲4000字符的VARCHAR2限制;數據庫中沒有存儲CLOB。如果可能的話,我根本不會使用CLOB。 – monitorjbl

+0

我的意思是,你使用getString()還是打開一個流來獲取數據? – Mike

回答

0

我不知道如何解決你的問題..但1種方法來最大限度地減少你的問題是有2個版本的功能。 1返回VARCHAR2和一個返回CLOB

您的VARCHAR2版本將在內部可以在CLOB版本,並返回一個異常代碼/值是否不再那麼32000分之4000字符

Java代碼然後可以提高檢測錯誤並且只需要爲需要它的少數情況直接重新調用clob版本。

0

在返回之前,可以將CLOB轉換爲VARCHAR。 PLSQL中VARCHAR的最大大小是32k。如果32k不夠大,則將結果存儲在臨時表中並使用JDBC讀取。這將比通過CLOB網絡協議更快。