【问题标题】:Oracle 12c: listagg function does not recognize the "on overflow" clause when attempting to use in SQLdeveloperOracle 12c:在 SQLdeveloper 中尝试使用时,listagg 函数无法识别“on overflow”子句
【发布时间】:2023-03-15 00:20:01
【问题描述】:

我正在尝试使用 listagg() 函数创建以逗号分隔的文档 URL 列表,它会导致 ORA-01489“字符串连接的结果太长”错误。所以我试图通过插入一个“溢出”子句来纠正这个问题,如下面的 sn-p:

  select distinct
    wo_id,
    listagg(document_id, ',' ON OVERFLOW TRUNCATE WITH COUNT) 
      within group (order by wo_id) over (partition by wo_id) as document_ids
  from
  (
    <...inner SELECT result set...>
  )

...但是当我尝试运行 SQL 语句时,我收到“ORA-00907 缺少右括号”错误 - 显然是因为 SQLdeveloper 不希望在第一组括号中看到“on”关键字。但是,我所有的 Google 搜索都表明我的语法是正确的。谁能发现我做错了什么?

【问题讨论】:

  • @GMB - 看起来这正是医生所要求的,现在开始工作了 - 谢谢! :-)

标签: string oracle aggregate-functions oracle12c listagg


【解决方案1】:

我怀疑您正在运行 Oracle on overflow 子句不可用。另一种方法是使用字符串长度的累积sum(),以字节为单位,并使用它来限制输出:

select wo_id, 
    listagg(document_id) within group (order by id) document_ids
from (
    select t.*, sum(lengthb(document_id)) over(partitionb by wo_id order by id) sum_len
    from mytable t
) t
where sum_lengthb < 4000
group by wo_id

注意事项:

  • 为此,您需要一个不同于分区列的排序列;我假设id

  • 我将外部查询更改为聚合查询;据推测,这是您的实际意图,而不是窗口聚合和distinct

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-09
    • 2016-12-30
    • 2023-03-07
    相关资源
    最近更新 更多