2009-11-11 21 views
1

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

我使用报告(它只是一个SQL查询),其中我根据ZoneName(国家等)合并电话代码,其中一些有一个区域代码吨 - 所以我可以得到“oveflow”错误原因listagg使用varchar2有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; 
/

而就目前而言,我的情况是“溢出”错误。

我想因为使用Varchar2,listagg proc将会有同样的问题。

任何建议?

UPD:我只需要这个(代报告的过程中的一个字段代码的集合),输出数据报告(以.pdf或同时打印)。在数据库中,所有的数据都是标准化的。

回答

0

最好的办法是规范化数据,以便每个字符串都有一个单独的行,那么您可以拥有的项目数限于te数据库而不是单个字段。

tab_to_string只用于输出,我怀疑你想看到一个> 32K字符的字段。

+0

我有规范化的数据 - 代码是在表中按层次分布的,然后通过之前的连接进行聚合。 是的,我需要在报告中的一个字段输出它们! 而我正好有一行的区域名称,它是一个字段中的此区域的价格和所有代码,打印时可能会相当长。 – zmische 2009-11-11 12:55:48

+0

如何以分隔形式打印或者在某处添加回车符? – Mark 2009-11-11 14:01:30

+0

我打印为表格 - coulmns,行。几乎与我在数据库上直接运行查询时看到的一样。 – zmische 2009-11-11 14:29:01

相关问题