2

我有一个 PL/SQL 函数可以从 MySQL 复制 GROUP_CONCAT()。该函数接受一个 CURSOR 并返回一个 VARCHAR2。但是,我的应用程序中有一些对象有足够的数据,连接字符串的大小大于 4000。由于我在 SELECT 语句(而不仅仅是 PL/SQL)中使用了这个函数,这让 Oracle 很生气并抛出了 ORA -06502。

因此,我更改了函数以返回 CLOB。这可以解决错误,但是当使用 JDBC 读取数据时,性能会受到很大影响。我正在读取大量数据并从 VARCHAR2 切换到 CLOB 导致执行时间减慢 10-20 倍。我一直在考虑以某种方式对此进行优化,但是由于 CLOB 是从函数返回的并且不在表中,所以我读过的大部分内容都不适用。

有什么办法可以改善这一点吗?我想强调的是,这与实际数据库的性能没有任何关系。连接最多 4000 个字符的值非常快,只有少数对象需要超过 4000 个字符,最大的值在 5000 个字符左右。LOB 通常针对大型原始数据进行优化,如果不是因为 Oracle 对 SELECT 语句中存在的列的大小限制,我不需要这样做。

编辑- 我想重申 CLOB 是在函数中创建的,它没有读取数据库中的任何 CLOB。它只是连接 VARCHAR2 并将结果作为 CLOB 返回。

4

2 回答 2

0

我不知道如何解决您的问题.. 但是最小化您的问题的一种方法是拥有 2 个版本的功能。1 返回 varchar2 和一个返回 clob

如果值长于 4000/32000 字符,您的 varchar2 版本可能会在内部使用 clob 版本并返回异常代码/引发错误

然后,您的 java 代码可以检测到这一点,并为少数需要它的情况直接重新调用 clob 版本。

于 2017-10-12T06:56:43.233 回答
0

您可以在返回之前将 CLOB 转换为 VARCHAR。PLSQL 中 VARCHAR 的最大大小为 32k。如果 32k 不够大,请将结果存储到临时表中并使用 JDBC 从中读取。这将比通过 CLOB 网络协议更快。

于 2017-10-12T08:26:45.357 回答