sql - 如何连接字符串?

标签 sql oracle string-aggregation

我在 Oracle 10g 上并具有以下表结构:
ID,
段落

我想按 id 分组并连接段落。每个段落可能有 1500 个字符或更多。

当我尝试 wm_concat 函数时,它提示字符串缓冲区太小。我实际上尝试了 Oracle 网站上的许多示例,但它们都失败了,错误是字符串缓冲区太小。

select id, wm_concat(paragraph) from paragraphs group by id

我该如何解决这个问题?

最佳答案

所以,我猜错误是 ORA-06502 我可以理解您可能会认为这不适用于您在这种情况下。

然而,这是wm_concat的错.这是一个函数,受 PL\SQL 中 Oracle 的最大 varchar 长度 32,767 和标准 SQL 中的 4,000 的约束。不幸的是,我认为,由于 wm_concat 的工作方式或函数内的任何较低约束,或者因为您在选择中使用它,您无法接近上限。

还有另一种选择, stragg , Tom Kyte 的字符串聚合函数。如果我们查看以下两者之间的比较,您会发现它们的性能几乎相同,并且两者的长度限制在 4,000 左右,即标准 SQL 最大值。 stragg稍微快一点,可能是由于缓存。

SQL> set serveroutput on
SQL>
SQL> create table tmp_test ( a varchar2(30) );

Table created.

SQL> insert into tmp_test
  2   select object_name
  3     from all_objects
  4          ;

81219 rows created.

SQL>  commit ;

Commit complete.

SQL>
SQL> declare
  2
  3    i integer := 1;
  4    k number(10);
  5    v_stragg varchar2(32767);
  6    v_test varchar2(32767) := '';
  7    start_time timestamp;
  8
  9  begin
 10
 11    select count(*)
 12      into k
 13      from tmp_test;
 14
 15    for i in 1 .. k loop
 16      start_time := systimestamp;
 17      begin
 18
 19        select wm_concat(a) into v_test
 20          from tmp_test
 21         where rownum < i;
 22
 23      exception when others then
 24        dbms_output.put_line('wm_concat: ' || length(v_test));
 25        dbms_output.put_line(systimestamp - start_time);
 26        exit;
 27     end;
 28    end loop;
 29
 30    for i in 1 .. k loop
 31      start_time := systimestamp;
 32
 33      select stragg(a) into v_test
 34        from tmp_test
 35       where rownum < i;
 36
 37      if v_test = 'OVERFLOW' then
 38        dbms_output.put_line('stragg: ' || length(v_stragg));
 39        dbms_output.put_line(systimestamp - start_time);
 40        exit;
 41      else v_stragg := v_test;
 42      end if;
 43    end loop;
 44  end;
 45  /
wm_concat: 3976
+000000000 00:00:00.005886000
stragg: 3976
+000000000 00:00:00.005707000

PL/SQL procedure successfully completed.

至于解决,恐怕你做不到。一旦你达到那个限制就是它。您必须找到一种不同的聚合方式,或者问问自己是否 真的需要。

关于sql - 如何连接字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8823509/

相关文章:

PHP-MySQL 查询优先显示一张表的行

Java JTDS 到 SQL Server 2000

php - 二级 key 的用途

java - 是否有可能获得在数据库包中声明的常量值? (SQL 或 Java)

sql-server - 查询将多行变成单行

mysql - SQL 选择大小写为

sql - 数据库实现 DDL 和 DML 的方式有区别吗?

database - 安装 Oracle Database 11g 第 2 版 (11.2.0.1.0) 时出现 RPM-GPG-KEY 错误

sql - Oracle 在 PostgreSQL 中提取 xml

postgresql - postgres 聚合不显示 LEFT JOIN 表有空值的行