Кодирование файла Oracle UTF8 с помощью Utl_file

Я хочу экспортировать свой файл в кодировке UTF8. Когда я проверил v$nls_parameters, nls_characterset имеет значение WE8ISO8859P9. Итак, кодировка моего файла - Ansii.

Как экспортировать файл в кодировке UTF8 без изменения параметров v$nls_parameters?

DECLARE
 v_os_touch_file                  utl_file.file_type;
 p_in_file                        VARCHAR2(50);
BEGIN
    v_os_touch_file := NULL;
    p_in_file := NULL;

    p_in_file := 'my_file_' || sysdate;
    v_os_touch_file := utl_file.fopen(my_path, p_in_file, 'w');
    FOR i IN (
        SELECT
            *
        FROM
            my_table
    ) LOOP
    begin

        utl_file.put_line(v_os_touch_file, 'TEST' );
        utl_file.put_line(v_os_touch_file, i.input);
         utl_file.fclose(v_os_touch_file);
END

person serdanarik    schedule 22.09.2020    source источник


Ответы (1)


Используйте UTL_FILE.FOPEN_NCHAR.

Несмотря на то, что содержимое буфера NVARCHAR2 может быть AL16UTF16 или UTF8 (в зависимости от национального набора символов базы данных), содержимое файла всегда читается и записывается в UTF8. UTL_FILE выполняет преобразование между UTF8 и AL16UTF16 по мере необходимости.

Обратите внимание, что использование p_in_file := 'my_file_' || sysdate; не очень разумно, поскольку оно зависит от текущей настройки сеанса пользователя NLS_DATE_FORMAT. Представьте, что формат по умолчанию — MM/DD/YYYY.

Лучше использовать, например, p_in_file := 'my_file_' || TO_CHAR(sysdate, 'YYYYMMDD');.

person Wernfried Domscheit    schedule 22.09.2020