相关疑难解决方法(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万
查看次数

PL/SQL:从没有循环的 select 语句生成 CSV varchar

使用 PL/SQL,我希望从 select 语句中以编程方式生成 CSV 字符串/varchar 对象。所以 select 语句的输出通常是 1-n 条记录(我只需要一列)。但关键是,我不能使用循环或任何迭代过程,而且必须在不使用外部库的情况下完成。

我可以自由地将数据转换为表格或不同的数据类型,并在需要时使用更多内存。但我不能明确使用循环。

我想我正在寻找一种方法来做这样的事情:

declare
   my_csv varchar2(4000);
begin
   select implode(my_column,',') into my_csv
   from my_table
   where some_column = 'some value';

   dbms_output.put_line('I got my list: ' || my_csv);
end;
Run Code Online (Sandbox Code Playgroud)

本质上,内理论上会像 PHP 内爆函数一样工作,而“,”逗号是我的分隔符。我可以自己定义内爆函数,但同样,我不能明确使用循环。

有任何想法吗?

csv plsql varchar2

0
推荐指数
1
解决办法
97
查看次数

标签 统计

csv ×1

java ×1

jdbc ×1

oracle ×1

oracle10g ×1

oracle11g ×1

plsql ×1

varchar2 ×1