Кодировка файлов Oracle UTF8 с помощью utl_file

#oracle #plsql #utf-8 #ansi #utl-file

#Oracle #plsql #utf-8 #ansi #utl-файл

Вопрос:

Я хочу экспортировать свой файл в кодировке 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
  

Ответ №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'); , например.