VARCHAR2 được giới hạn trong 4000 byte. Nếu bạn nhận được lỗi này
L ERI tại dòng 191: ORA-01489: kết quả của chuỗi nối quá dài.
Sau đó, khá rõ ràng rằng kết nối vượt quá 4000 byte.
Bây giờ phải làm gì?
Giải pháp đầu tiên của bạn để sử dụng CLOB thay thế là chính xác.
select TO_CLOB(a)|| TO_CLOB(b)|| TO_CLOB(c) || TO_CLOB(d)
Nó có vẻ như vấn đề thực sự của bạn được tiết kiệm để nộp
Trên truy vấn không được spooling dữ liệu đúng vào tập tin văn bản.
Trong khi bạn không đăng cách lưu kết quả vào một tệp, tôi tin rằng bạn không thực hiện đúng cách.Nếu bạn cố gắng lưu vào tập tin giống như cách bạn đang làm với VARCHAR2, bạn đang làm sai.
Trước tiên, bạn cần sử dụng dbms_lob.read
để đọc thư viện từ cơ sở dữ liệu, sau đó sử dụng utl_file.put_raw
để ghi vào tệp.
DECLARE
position NUMBER := 1;
byte_length NUMBER := 32760;
length NUMBER;
vblob BLOB;
rawlob RAW(32760);
temp NUMBER;
output utl_file.file_type;
BEGIN
-- Last parameter is maximum number of bytes returned.
-- wb stands for write byte mode
output := utl_file.fopen('DIR', 'filename', 'wb', 32760);
position := 1;
select dbms_lob.getlength(yourLob)
into len
from somewhere
where something;
temp := length;
select yourLob
into vlob
from somewhere
where something;
IF len < 32760 THEN
utl_file.put_raw(output, vblob);
-- Don't forget to flush
utl_file.fflush(output);
ELSE -- write part by part
WHILE position < len AND byte_length > 0
LOOP
dbms_lob.read(vblob, byte_length, position, rawlob);
utl_file.put_raw(output,rawlob);
-- You must admit, you would have forgot to flush.
utl_file.fflush(output);
position := position + byte_length;
-- set the end position if less than 32000 bytes
temp := temp - bytelen;
IF temp < 32760 THEN
byte_length := temp;
END IF;
END IF;
END;
Nguồn
2015-05-07 16:43:20
Một số lịch phát sóng. là mẹo tại: http://stackoverflow.com/questions/14864055/listagg-function-and-ora-01489-result-of-string-concatenation-is-too-long – Sampath