我有一個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返回。
你是如何找回數據的?可能也想看看這個:http://docs.oracle.com/cd/B19306_01/appdev.102/b14249/adlob_performance.htm – Mike
我得到單個行中每個對象的所有數據。這就是我將值連接起來而不是隻讀多行的原因。一切都很好,直到我發現某些對象在其中一個連接列中有4000個以上的字符。這個Oracle文檔在這種情況下並不是非常有用,因爲我從一個函數創建CLOB僅僅是因爲4000字符的VARCHAR2限制;數據庫中沒有存儲CLOB。如果可能的話,我根本不會使用CLOB。 – monitorjbl
我的意思是,你使用getString()還是打開一個流來獲取數據? – Mike