【问题标题】:ORA-01489: result of string concatenation is too longORA-01489: 字符串连接的结果太长
【发布时间】:2011-08-13 03:33:43
【问题描述】:

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

下面的 sql 查询旨在以管道分隔的形式从数据库中提取数据并将其假脱机到 unix 上的文本文件中

select a||'|'||b||'|'||c||'|'||d from table 
union
select a||'|'||b||'|'||c||'|'||d from table 

有时会出现 ORA 错误 ORA-01489: result of string concatenation is too long

如果选择超过 4000 个限制,这看起来会发生

我尝试使用 to_clob 但这仅适用于“联合所有”

有什么办法可以解决这个问题

【问题讨论】:

标签: sql


【解决方案1】:

在连接之前进行联合。

select to_clob(a) ||'|'|| to_clob(b) ||'|'|| to_clob(c) ||'|'|| to_clob(d) from
  (
   select a, b, c, d from table1
    union
   select a, b, c, d from table2
  )

【讨论】:

    【解决方案2】:

    如您所见,使用to_clob 有其局限性。老实说,我认为您正在使用一个很好的工具(RDBMS)作为钝器旧石器时代的武器。

    解决该问题的最简单方法是在您的代码中原位进行连接,而不是使用 SQL 进行连接。 Oracle 中的串联操作有最大长度限制(4k 长度),并且您可以使用to_clob 的位置也有限制。

    因此,如果您有这两个硬性限制,最明智的做法是按照我的建议去做(在代码中进行连接),而不是试图颠覆或找到一种几乎神奇的方法来解决这个问题。

    从表 A 中选择 a、b、c、d 联盟 从表 B 中选择 a、b、c、d

    然后获取结果集(或您使用的任何特定于语言的构造)并连接应用程序代码中的字段。

    【讨论】:

      【解决方案3】:

      我用这种方式查找程序

      select name, LISTAGG(text, ' ' ON OVERFLOW TRUNCATE) WITHIN GROUP (ORDER BY name) from all_source where name in 
      (select distinct name from all_source where type = 'PROCEDURE' and text like '%P_%') and text like '% OUT %' group by name;
      

      有趣的是,表 all_source 有每个过程的信息,按行划分,处理起来很棘手。出于这个原因,我首先连接每个过程的行,然后设置选项 ON OVERFLOW TRUNCATE 以避免字符串溢出;当然它对我有用,因为我只需要过程声明。 在这种情况下,我正在寻找名称中包含“P_”并具有 OUT 类型的属性的过程。 这同样适用于搜索功能,仅通过 type = 'FUNCTION' 更改 type = 'PROCEDURE' 希望对您有所帮助。

      【讨论】:

        猜你喜欢
        • 2017-02-06
        • 2016-05-28
        • 2013-04-04
        • 1970-01-01
        • 2015-06-28
        • 2012-05-12
        • 1970-01-01
        • 2013-01-29
        • 1970-01-01
        相关资源
        最近更新 更多