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

时间:2011-04-26 15:22:05

标签: sql

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

下面的sql查询用于从数据库中提取数据作为管道分隔,并将其假脱机到unix上的文本文件

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

有时会出现ORA错误ORA-01489:字符串连接的结果太长

如果选择超过4000限制

,这看起来就像是一样

我尝试使用to_clob,但这只适用于“union all”

有没有办法可以解决这个问题

3 个答案:

答案 0 :(得分:6)

在连接之前进行联合。

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
  )

答案 1 :(得分:2)

正如您所知,使用to_clob有其局限性。说实话,我认为你使用的是一个很好的工具(一个RDBMS)作为一种钝的旧石器武器。

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

所以,如果你有这两个硬限制,那么最明智的做法是做我建议你的事情(在代码中进行连接),而不是试图颠覆或找到一种几乎神奇的方法来解决这个问题。

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

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

答案 2 :(得分:0)

这种方式我用来查找程序

WITH mytable 
    (id, serv1, serv2, serv3, serv4, serv5, serv6) 
AS (
VALUES 
    ('001', 2,3,5,1,4,6),
    ('002', 2,1,5,3,4,6),
    ('003', 6,2,5,3,4,1)
)
SELECT id, tjs.key column_name
FROM mytable t, json_each_text(row_to_json(t)) tjs
WHERE tjs.value = '1'

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