我有一个PL / SQL函数来从MySQL复制GROUP_CONCAT()。该函数接受CURSOR并返回VARCHAR2。但是,我的应用程序中有一些对象具有足够的数据,连接字符串的大小大于4000.因为我在SELECT语句中使用此函数(而不仅仅是PL / SQL),这会让Oracle生气并抛出ORA -06502。
所以,我改变了函数来返回CLOB。这会处理错误,但是当使用JDBC读取数据时,性能会受到很大影响。我正在读取大量数据并从VARCHAR2s切换到CLOB导致执行时间缩短10-20倍。我一直在寻找以某种方式优化它,但由于CLOB是从函数返回而不在表中,因此我读过的大部分内容都不适用。
有没有办法改善这个?我想强调一点,这与实际数据库的性能没有任何关系;连接最多4000个字符的值非常快,只有少数对象需要更多,最大值约为5000个字符。 LOB通常针对大型原始数据进行了优化,如果不是因为对SELECT语句中存在的列的Oracle大小限制,我不需要这样做。
编辑 - 我想重申CLOB在函数中创建,它不会读取数据库中的任何CLOB。它只是连接VARCHAR2并将结果作为CLOB返回。
答案 0 :(得分:0)
我不知道如何解决您的问题..但是最小化您的问题的一种方法是拥有2个版本的功能。 1返回varchar2,返回clob
您的varchar2版本可以在内部使用clob版本,如果值超过4000/32000个字符,则返回异常代码/引发错误
然后你的java代码可以检测到它,并直接针对少数需要它的情况重新调用clob版本。
答案 1 :(得分:0)
您可以在返回之前将CLOB转换为VARCHAR。 PLSQL中VARCHAR的最大大小为32k。如果32k不够大,则将结果存储到临时表中并使用JDBC从中读取。这比通过CLOB网络协议要快。