Lỗi ORA-01489: result of string concatenation is too long trong Oracle xảy ra khi sử dụng hàm LISTAGG() hoặc phép nối chuỗi (||) và kết quả vượt quá giới hạn kích thước chuỗi cho một giá trị VARCHAR2, cụ thể là 4000 byte trong SQL thường hoặc 32767 byte trong PL/SQL.

1. Sử dụng XMLAGG() thay thế LISTAGG()
Trong một số trường hợp, có thể sử dụng hàm XMLAGG để kết hợp chuỗi mà không bị giới hạn độ dài 4000 ký tự. Tuy nhiên, kết quả trả về sẽ là một đối tượng XML, cần chuyển đổi lại về chuỗi.

Ví dụ:
SELECT A.ISDN, A.NAME, A.ID_NO, A.DEVICE, RTRIM(XMLAGG(XMLELEMENT(e, B.ISDN || '; ').EXTRACT('//text()') ORDER BY B.ISDN).GetClobVal(), '; ') AS ISDN_LIST 
FROM HAU_TMP2 A LEFT JOIN HAU_TMP3 B 
ON A.ID_NO = B.ID_NO AND LOWER(A.DEVICE) = LOWER(B.DEVICE) 
GROUP BY A.ISDN, A.NAME, A.ID_NO, A.DEVICE;

2. Sử dụng hàm DBMS_LOB.SUBSTR

Sử dụng các hàm từ gói DBMS_LOB để làm việc với các chuỗi dài hơn. Ví dụ, có thể thay thế kết quả của hàm LISTAGG bằng một đối tượng LOB (Large Object).

Ví dụ:
SELECT A.ISDN, A.NAME, A.ID_NO, A.DEVICE, DBMS_LOB.SUBSTR(CAST(LISTAGG(CASE WHEN B.DEVICE IS NOT NULL THEN B.ISDN END, '; ') WITHIN GROUP (ORDER BY B.ISDN) AS CLOB), 4000, 1) AS ISDN
FROM HAU_TMP2 A LEFT JOIN HAU_TMP3 B
ON A.ID_NO = B.ID_NO AND LOWER(A.DEVICE) = LOWER(B.DEVICE)
GROUP BY A.ISDN, A.NAME, A.ID_NO, A.DEVICE;