Буферизация Oracle PL / SQL UTL_FILE.PUT - PullRequest
5 голосов
/ 26 августа 2011

Я пишу большой файл размером> 7 МБ из хранимой процедуры Oracle, и требования не должны содержать символов окончания строки (без возврата каретки / перевода строки) в конце каждой записи.

Я написал хранимую процедуру с использованием UTL_FILE.PUT и отслеживаю каждый вызов UTL_FILE.PUT с помощью UTL_FILE.FFLUSH. Эта процедура приводит к ошибке записи, когда я дохожу до того, что записал больше, чем размер буфера (установлен максимум 32767), хотя я делаю вызовы FFLUSH. Процедура работает нормально, если я заменяю вызовы PUT вызовами PUT_LINE.

Разве нельзя писать больше размера буфера без символа новой строки? Если да, то есть ли обходной путь?

Ответы [ 4 ]

4 голосов
/ 26 августа 2011

удалена цитата из документов, см. Ответ Олли

Другой возможный способ сделать это - хранимая процедура Java, где вы можете использовать более полнофункциональный Java API для создания и написанияк файлам.

4 голосов
/ 26 августа 2011

Дастин,

Документация Oracle здесь: http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14258/u_file.htm#i1003404

утверждает, что: FFLUSH физически записывает ожидающие данные в файл, идентифицированный дескриптором файла. Обычно данные, записываемые в файл, буферизуются. Процедура FFLUSH заставляет буферизованные данные записываться в файл. Данные должны заканчиваться символом новой строки.

Последнее предложение является наиболее подходящим.

Не могли бы вы записать данные, используя UTL_FILE.PUT_LINE, прежде чем искать в результирующем файле терминаторы строк и удалять их?

Просто мысль ....

1 голос
/ 27 августа 2011

Хотя это меньше, чем желательно, вы всегда можете PUT, пока не обнаружите, что приближаетесь к размеру буфера. Когда это происходит, вы можете FCLOSE дескриптор файла (очистить буфер) и заново открыть тот же файл с помощью FOPEN, используя 'a' (добавление) в качестве режима. Опять же, этого метода, как правило, следует избегать, особенно если другие процессы также пытаются получить доступ к файлу (например: закрытие файла обычно отменяет любые блокировки, которые на него наложил процесс, освобождая любые другие процессы, которые пытались получить блокировку ).

0 голосов
/ 30 августа 2011

Спасибо за все замечательные ответы, они были очень полезны.Хранимая процедура Java выглядела как способ, но, поскольку у нас нет большого опыта работы с Java, она будет неодобрительно воспринята руководством.Но я смог найти способ сделать это из хранимой процедуры.Мне пришлось открыть файл в режиме записи байтов «WB».Затем для каждой записи, которую я записываю в файл, я конвертирую ее в тип данных RAW с помощью UTL_RAW.CAST_TO_RAW.Затем используйте UTL_FILE.PUT_RAW для записи в файл, а затем любые необходимые вызовы FFLUSH для очистки буферов.Принимающая система смогла прочитать файлы;пока все хорошо.

...