有人建议如何使用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或同时打印)。在数据库中,所有的数据都是标准化的。
我有规范化的数据 - 代码是在表中按层次分布的,然后通过之前的连接进行聚合。 是的,我需要在报告中的一个字段输出它们! 而我正好有一行的区域名称,它是一个字段中的此区域的价格和所有代码,打印时可能会相当长。 – zmische 2009-11-11 12:55:48
如何以分隔形式打印或者在某处添加回车符? – Mark 2009-11-11 14:01:30
我打印为表格 - coulmns,行。几乎与我在数据库上直接运行查询时看到的一样。 – zmische 2009-11-11 14:29:01