【问题标题】:listagg using when overflow of varchar2 occures - what to do?发生 varchar2 溢出时使用 listagg - 怎么办?
【发布时间】:2009-11-11 12:32:08
【问题描述】:

有人可以建议在使用 listagg 导致 varchar2 溢出时该怎么做,因为一个字段中有大量聚合字符串(在 SQL 查询中通过 Group 等进行聚合期间)?

我使用报告(它只是一个 SQL 查询),在其中我按 ZoneName(国家/地区等)汇总电话代码,其中一些有一个区域的大量代码 - 所以我可以使用 varchar2 得到“oveflow”错误导致 listagg有 32767 个限制。

那么在这种情况下该怎么办呢?重写查询并使用游标?是否有一种解决方法来检测“oveflow”并将例如“BIG FIELD”分成两行,以便在每一行中都有足够的空间用于“BIG list of Codes”???

因为我现在使用的是 10gR2,所以我使用的是 Tom Kyte 的“Tab to string”技术。 它使用类型:

CREATE OR REPLACE TYPE t_varchar2_tab AS TABLE OF VARCHAR2(32767);

还有 proc,它将表的 Varchar2 转换为具有 32767 个字符限制的字符串。

CREATE OR REPLACE FUNCTION tab_to_string (p_varchar2_tab  IN  t_varchar2_tab,
                                          p_delimiter     IN  VARCHAR2 DEFAULT ',') RETURN VARCHAR2 IS
  l_string     VARCHAR2(32767);
BEGIN
  FOR i IN p_varchar2_tab.FIRST .. p_varchar2_tab.LAST LOOP
    IF i != p_varchar2_tab.FIRST THEN
      l_string := l_string || p_delimiter;
    END IF;
    l_string := l_string || p_varchar2_tab(i);
  END LOOP;
  RETURN l_string;
END tab_to_string;
/

目前,我遇到了“溢出”错误。

我想listagg proc 会因为使用Varchar2 而出现同样的问题。

有什么建议吗?

UPD:我只需要这个(在生成报告期间聚合一个字段中的代码)来输出报告数据(以 .pdf 格式或在打印时)。在数据库中,所有数据都是标准化的。

【问题讨论】:

    标签: sql oracle10g


    【解决方案1】:

    最好的方法是对数据进行规范化,这样您就可以将每个字符串放在一个单独的行中,然后您可以拥有的项目数仅限于数据库而不是单个字段。

    tab_to_string 仅对输出有用,我怀疑您是否希望看到 > 32K 个字符的字段。

    【讨论】:

    • 我有规范化的数据 - 代码分层位于表中,然后通过之前的连接聚合。是的,我需要在报告的一个字段中输出它们!确切地说,我在一个字段中有一个带有区域名称的行,它是这个区域的价格和所有代码,打印时它可能会很长。
    • 如何只打印分隔格式,还是在某个地方添加回车?
    • 我打印为表格 - 列、行。几乎和我直接在 DB 上运行查询时看到的一样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-04
    • 1970-01-01
    • 2023-03-16
    • 1970-01-01
    • 2017-04-10
    相关资源
    最近更新 更多