Работа с Oracle в среде UNIX


Всем привет!
Данная статья посвящена вопросам с кодировкой при работе с БД Oracle через SAS на среде UNIX
Сколько «собак уже было съедено» с вопросами кодировки, но, тем не менее, они периодически всплывают. Например, отображение вопросительных знаков вместо русских букв, является распространённой проблемой. 
Попробуем разобраться ниже.

В первую очередь перед настройкой кодировки я настоятельно рекомендую прочитать пару документов:
Далее, необходимо убедиться, что на сервере UNIX, где установлен SAS, установлен клиент Oracle. Сделать это можно, запустив следующую командную строку через Putty:
echo $ORACLE_HOME
Если данный параметры возвращает пустую строку, то скорее всего клиент Oracle отсутствует.
Даже если клиент установлен, скорее всего, придётся проверить следующие параметры: PATH и LD_LIBRARY_PATH. Запускаем командную строку:
echo $PATH
В строке PATH ищем что-то вроде /../oracle/client64/bin
Если такой строки нет, то необходимо выполнить следующую команду:
export PATH=$PATH:/../oracle/../bin
Аналогично проверяем второй параметр, запустив следующую команду:
echo $LD_LIBRARY_PATH
Если такой параметр отсутствует, то необходимо выполнить следующую команду
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
Следующим шагом будет установка (или мы убедимся, что они установлены) необходимых библиотек для корректной работы SAS в системе UNIX. Для этого, запустим следующую командную строку на сервере SAS:
yum install libXp glibc libXp-devel
Как показала практика, такие вещи забывают делать, а потом сложно разобраться, откуда появляются проблемы. Без данных библиотек практически невозможно разобраться с ошибками, которые появляются в логах, так как они сообщают о том, что с данной ошибкой необходимо обратиться в техническую поддержку SAS.
Далее, необходимо выявить в какой кодировке была развернута БД Oracle. Запустим следующую строку, например, вSQL Developer:
select * from nls_database_parameters
В качестве результаты мы получим список параметров, и нас интересуют следующие:
NLS_LANGUAGE
AMERICAN
NLS_TERRITORY
AMERICA
NLS_NCHAR_CHARACTERSET
AL16UTF16
Во втором столбце настойки использованы в качестве примера.
Далее, смотрим на конфигурационную настройку сессий SAS. Для этого в SAS Base, SAS Enterprise Guide или другой среде, где можно запустить SAS код, запускаем следующую строку:
Proc options
     option=config
     option=locale
     option=encoding;
Run;
В качестве результата, может получиться что-то вроде:

CONFIG=(
/SAS94/SASHome/SASFoundation/9.4/sasv9.cfg
/SAS94/SASHome/SASFoundation/9.4/nls/u8/sasv9.cfg
/SAS94/SASHome/SASFoundation/9.4/sasv9_local.cfg
/SAS94/sasconfig/Lev1/SASApp/sasv9.cfg
/SAS94/sasconfig/Lev1/SASApp/sasv9_usermods.cfg
/SAS94/sasconfig/Lev1/SASApp/WorkspaceServer/sasv9.cfg
/SAS94/sasconfig/Lev1/SASApp/WorkspaceServer/sasv9_usermods.cfg )

LOCALE=EN_US      Specifies the current locale for the SAS session
ENCODING=UTF-8    Specifies default encoding for internal processing of data
Таким образом, мы видим настройки как среды SAS, так и Oracle.
В принципе, данные настройки являются корректными, тем не менее проблема с отображением кириллицы может оставаться.
В данном вопросе приходит на помощь параметр NLS_LANG. Попробуем запустить командную строку в UNIX:
echo $NLS_LANG
Данный параметр может оказаться вовсе пустым.
Для кодировки AL16UTF16 я рекомендую запустить следующую командную строку:
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
Для того чтобы настройки вступили в силу, необходимо перезагрузить SAS ObjectSpawner на сервере SAS. Для этого запускаем командную строку:
/../sasconfig/Lev1/ObjectSpawner/ObjectSpawner.sh restart
Если же, необходимо отобразить кодировку CYRILLIC, то для этого необходимо запустить строку с другим параметром:
export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
Но этого будет не достаточно. Также потребуется добавить следующий параметр в файл:
/../sasconfig/Lev1/SASApp/WorkspaceServer/sasv9_usermods.cfg
-ENCODING=WCYRILLIC
Далее перезагружаем SAS ObjectSpawner.
Но в случае перезагрузки сервера, или всех служб SAS, всё придётся выставлять заново. Для того, чтобы этого избежать добавим все необходимые параметры в файл /home/user/.bash_profile:
export PATH=$PATH:/../oracle/../bin
export LD_LIBRARY_PATH=$ORACLE_HOME/lib
export NLS_LANG=AMERICAN_AMERICA.CL8MSWIN1251
Вместо пользователя user необходимо подставить имя пользователя, из-под которого запускаются процессы SAS.
На этом всё!