【发布时间】:2017-03-03 17:54:22
【问题描述】:
我有以下用户定义的表:
CREATE OR REPLACE TYPE number_ntt AS TABLE OF varchar2(500);
我还有以下功能:
CREATE OR REPLACE FUNCTION TO_STRINGS (
nt_in IN number_ntt,
delimiter_in IN VARCHAR2 DEFAULT ','
) RETURN VARCHAR2 IS
v_idx PLS_INTEGER;
v_str VARCHAR2(32767);
v_dlm VARCHAR2(10);
BEGIN
v_idx := nt_in.FIRST;
WHILE v_idx IS NOT NULL LOOP
v_str := v_str || v_dlm || nt_in(v_idx);
v_dlm := delimiter_in;
v_idx := nt_in.NEXT(v_idx);
END LOOP;
RETURN v_str;
END TO_STRINGS;
/
EXIT;
现在,我正在运行以下查询:
SELECT A.PERSONNUMBER,
(select TO_STRINGS
(CAST(COLLECT(C.LOCATIONNAME) as number_ntt)
) AS cnt
from client.Tab_EMPLOYEES B JOIN client.Tab_Locations C ON B.MOBILELOCATIONID = C.MOBILELOCATIONID
WHERE B.PERSONNUMBER = A.PERSONNUMBER) as Assignedlocations
FROM client.Tab_EMPLOYEES A WHERE A.MOBILELOCATIONID = '100';
但我收到以下错误:
ORA-06502:PL/SQL:numeric or value error:string buffer too 小 ORA-06512:在第 1 行。
我认为我需要修改TO_STRINGS 函数或查询;任何帮助都将受到高度赞赏。
提前致谢。
【问题讨论】:
-
Tab_Locations中是否有LOCATIONNAME列? -
字符串拼接的结果是否有可能超出限制?另外,您似乎需要一种连接字符串的方法,您确定需要用户定义的函数吗?您能否发布一些示例数据和期望的结果?
-
需要自己写函数吗?现代版本的 Oracle 有许多内置函数可以有效地聚合字符串。 See this SO thread