相关疑难解决方法(0)

Listagg函数和ORA-01489:字符串连接的结果太长

当我运行以下查询时:

 Select
  tm.product_id,
  listagg(tm.book_id || '(' || tm.score || ')',',')
    within group (order by tm.product_id) as matches
from
  tl_product_match tm 
where
  tm.book_id is not null 
group by
  tm.product_id
Run Code Online (Sandbox Code Playgroud)

Oracle返回以下错误:

 ORA-01489: result of string concatenation is too long
Run Code Online (Sandbox Code Playgroud)

我知道失败的原因是listagg函数试图连接大于4000个字符的值,这些值不受支持.

我已经看到了这里描述的替代示例 - http://www.oracle-base.com/articles/misc/string-aggregation-techniques.php但它们都需要使用函数或过程.

是否有一个纯SQL的解决方案,而无需调用函数或存储过程,并且能够使用标准JDBC读取值?

我遇到的另一个困难是我见过的大多数字符串聚合示例都显示了如何按原样读取值的示例.在我的例子中,我首先修改了值(即我正在聚合两列).

java oracle jdbc oracle10g oracle11g

11
推荐指数
2
解决办法
2万
查看次数

Oracle - ORA-01489:字符串连接的结果太长

创建一个视图,其中一个字段(6个)是源表中两个字段的串联.创建了第二个视图,该视图使用listagg可能组合串联的结果.使用此两步操作正确返回源表中两个字段的listagg并置.

当我尝试创建一个既产生连接又产生listagg的视图时,我得到oracle错误ora-01489字符串连接的结果太长.

作为测试,我选择了max(长度(连接字段)并且返回了837.所以看起来错误是错误的.

所以它必须在语法中.我已经尝试过rtrim,trim甚至substr,但是无法获取view语句来编译listagg(连接)和返回数据.

我能够开发正确返回数据的两个视图表明我有基本语法,但是将连接与listagg函数结合起来的任务我还没弄清楚.

在另一种情况下,我能够在一个语句中将串联与listagg函数结合起来:

    LISTAGG (STATEMENTS || ' - ' || BIRTH_DATE, ';  ')
                   WITHIN GROUP (ORDER BY STATEMENTS || ' - ' || BIRTH_DATE)
                   AS GROWING_UP
Run Code Online (Sandbox Code Playgroud)

此语法正确返回所需的数据.........

但在上述情况下,类似的语法会产生Ora-01489错误.

知道有时Oracle错误可能会产生误导,我想知道是否有任何板载专家可能知道除了声明Oracle可能会抛出此错误之外的任何其他原因?

LISTAGG ((NUMBER || '-' || text), ',') WITHIN GROUP (ORDER BY (NUMBER || '-' || text))
AS
  restrictions FROM source
Run Code Online (Sandbox Code Playgroud)

返回错误

sql oracle size oracle11g listagg

11
推荐指数
1
解决办法
7万
查看次数

标签 统计

oracle ×2

oracle11g ×2

java ×1

jdbc ×1

listagg ×1

oracle10g ×1

size ×1

sql ×1