【问题标题】:ORA-01489: result of string concatenation is too long 01489. 00000 - "result of string concatenation is too long" [duplicate]ORA-01489: 字符串连接的结果太长 01489. 00000 - “字符串连接的结果太长” [重复]
【发布时间】:2016-05-28 21:30:05
【问题描述】:

我有这个查询,但我得到一个 ORA-01489 错误:ORA-01489:字符串连接的结果太长 01489。00000 -“字符串连接的结果太长”,是否可以解决这个问题,也许设置一个系统变量?

SELECT "USER_PRIMARY_sector","LOGIN","FIRST_NAME","LAST_NAME","sector_ROLE"
FROM (
SELECT user_primary_sector,login, first_name,  last_name,
       LTRIM(MAX(SYS_CONNECT_BY_PATH(rights,' / '))
       KEEP (DENSE_RANK LAST ORDER BY curr),' / ') AS sector_ROLE
      FROM  
        (SELECT  login,
              first_name,  
              last_name,
              user_primary_sector,
              rights,
              ROW_NUMBER() OVER (PARTITION BY login ORDER BY rights) AS curr,
              ROW_NUMBER() OVER (PARTITION BY login ORDER BY rights) -1 AS prev
        FROM  (select   member0_.login,  member0_.first_name first_name, sector2.sector_name user_primary_sector,  member0_.last_name last_name,
                        CONCAT(CONCAT(sector.sector_name, ' - '), role3_.role_name) rights 
 from
  TLC_DEVICES.t_member member0_
 inner join  TLC_DEVICES.t_user member0_1_    on member0_.member_id=member0_1_.user_id
 inner join  TLC_DEVICES.t_playable_role playedrole1_    on member0_.member_id=playedrole1_.user_id
 inner join  TLC_DEVICES.t_sector_role sectorrole2_    on playedrole1_.sector_role_id=sectorrole2_.sector_role_id
 inner join  TLC_DEVICES.t_role role3_    on sectorrole2_.role_id=role3_.role_id
 inner join  TLC_DEVICES.t_sector sector    on sectorrole2_.sector_id=sector.sector_id
 inner join  TLC_DEVICES.t_sector sector2    on sector2.sector_id=member0_1_.primary_sector_id
 where    current_date between playedrole1_.start_date and playedrole1_.end_date
 order by sector.sector_name
  ))
GROUP BY login, first_name,  last_name, user_primary_sector
CONNECT BY prev = PRIOR curr AND login = PRIOR login
START WITH curr = 1
)
ORDER BY user_PRIMARY_sector, FIRST_NAME, LAST_NAME;

【问题讨论】:

  • 如果您删除复杂查询的部分内容,直到它仍然以最简单的形式给出错误,这将有助于我们为您提供帮助。
  • 你真的用的是 11g,还是你用的是 12c 或更高版本?
  • 我其实用的是12c

标签: oracle oracle12c


【解决方案1】:

一种选择是将MAX_STRING_SIZE 系统变量设置为EXTENDED。 来自甲骨文documentation

具有最大长度 size 个字节或字符的可变长度字符串。您必须为 VARCHAR2 指定大小。最小大小为 1 个字节或 1 个字符。最大尺寸为:

如果 MAX_STRING_SIZE = EXTENDED,则为 32767 个字节或字符
如果 MAX_STRING_SIZE = STANDARD,则为 4000 个字节或字符

因此,如果您的 MAX_STRING_SIZE 当前设置为 STANDARD,那么如果您的连接字符串超过 4000 个字节或字符,您将收到 ORA-01489 错误。以下是您可以进行更改的方法:

ALTER SYSTEM SET MAX_STRING_SIZE = EXTENDED;

如果您的MAX_STRING_SIZE 已经设置为EXTENDED,那么您将不得不寻找另一种方法来处理如此长的字符串。

【讨论】:

  • 这只有在12c 中才有可能,而 OP 在11g 上。对于任何应用程序,如果字符串聚合超过数据库级​​别的限制,这不是一个好的设计。应用程序使用 CLOB 数据类型来满足如此巨大的存储需求。
  • @LalitKumarB 他将此标记为正确,这意味着他正在使用11g 并且没有对其进行测试,或者实际上正在使用12c。如果他回来,我会删除。
猜你喜欢
  • 2017-02-06
  • 2011-08-13
  • 2013-04-04
  • 2015-06-28
  • 1970-01-01
  • 2012-05-12
  • 1970-01-01
  • 2021-01-18
  • 2013-01-29
相关资源
最近更新 更多