-
Публикувайте версията на Oracle, която използвате! Или можем просто да гадаем...
-
Вашият
fflush
няма да работи както очаквате - От документацията :FFLUSH записва физически чакащи данни във файла, идентифициран от манипулатора на файла. Обикновено данните, които се записват във файл, се буферират. Процедурата FFLUSH принуждава буферираните данни да бъдат записани във файла. Данните трябва да завършват със знак за нов ред.
-
tbone е абсолютно прав редът TO_CHAR(10) е грешен! Просто опитайте
SELECT TO_CHAR(10) FROM DUAL;
ще получите10
които след това сравнявате с един знак. Единичен знак никога няма да бъде '10', тъй като 10 има два знака! -
Вашият проблем най-вероятно е препълване на буфера с твърде големи XML-файлове, но имайте предвид, че и други проблеми в целевата система могат да доведат до write_errors, които трябва да бъдат обработени.
Решения
-
Бързо и мръсно :Тъй като така или иначе изглежда не ви интересува производителността, можете просто да затворите файла на всеки X байт и да го отворите отново с A за добавяне. Така че просто добавете към цикъла:
IF MOD( l_offset, 32000 ) = 0 THEN UTL_FILE.FCLOSE( f_out ); UTL_FILE.FOPEN( out_fpath, out_fname, f_out, 'a', 32767 ); END IF;
-
Използвайте правилния инструмент за правилната работа:
UTL_FILE
не е подходящ за работа със сложни данни. Единственият случай на използване на UTL_FILE са малки редове текст, разделени с нов ред. За всичко останало трябва да пишете RAW байтове! (Което също така ще ви позволи да контролирате porper върху КОДИРАНЕТО, което в момента е просто мини-ванилно-щастливо предположение) -
Напишете Java-Stored-Procedure с NIO-Filechannels - бързо, безопасно, приятно... Но бъдете внимателни, вашата програма може да работи 10 пъти по-бързо!