【发布时间】: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 格式或在打印时)。在数据库中,所有数据都是标准化的。
【问题讨论】: