VARCHAR2 са ограничени до 4000 байта. Ако получите тази грешка
Тогава е съвсем ясно, че конкатенацията надхвърля 4000 байта.
Какво да правя сега?
Вашето първо решение да използвате CLOB вместо това е правилно.
select TO_CLOB(a)|| TO_CLOB(b)|| TO_CLOB(c) || TO_CLOB(d)
Изглежда, че истинският ви проблем е записването във файл
Въпреки че не сте публикували как да запишете получения резултат във файл, смятам, че не го правите правилно. Ако се опитате да запазите във файл по същия начин, както сте го правили с VARCHAR2, го правите погрешно.
Първо трябва да използвате dbms_lob.read
за да прочетете clob от базата данни, след това използвайте utl_file.put_raw
за запис във файл.
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;