Работа с 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.
На этом всё!

Что нужно знать при работе со сторонними Базами Данных?

Всем примет.

В сегодняшнем видео уроки хотелось бы затронуть тему работы со сторонними базами данных.  Будем рассматривать работу SAS c БД Oracle.

Вы узнаете:

  • Что именно SAS посылает в БД?
  • Почему один и тот же запрос может давать разные результаты на одних и тех же данных?
  • Как узнать оптимально ли работает join таблиц в моем коде?
И так представляю Вашему внимание видеоурок:
До скорых встреч. 

Настройка работы SAS с БД Oracle

Всем привет!
Данная статья посвящена тому, как правильно надо настраивать систему для работы с БД Oracle в системах Windows. Так или иначе, какая-то часть информации уже и ранее была опубликована на нашем сайте. Тут будет собрана вся необходимая информация в одном месте!

1. На первом этапе, необходимо убедиться, что SAS Access To Oracle есть в лицензии и установлен. Для этого заходим в SAS Base Enterprise guide и вводим следующий код:

proc setinit;
run;
В логе будет отображён список, где и ищем —SAS/ACCESS Interface to Oracle.
2. Далее, устанавливаем правильную версию клиента Oracle, разрядность которой будет соответствовать разрядности установленного SAS. Для этого заходим на сайт ORACLE, где и ищем необходимую версию и разрядность клиента или базы. После чего скачиваем и устанавливаем дистрибутив. Желательно перезагрузить систему.
Замечу, что изначально рекомендуется установить Oracle Client до установки SAS.
3. В файле TNSNAMES.ORA указываем параметры доступа к нашей БД.
Примерно по следующему пути можно найти необходимый файл:
С:APPPRODUCT11.2.0CLIENT_1NETWORKADMIN
В TNS указываются следующие параметры:
NAME =
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = HOST_NAME)(PORT = PORT))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = SID_NAME)
    )
  )
Подчёркнутое прописывать ручками =)
На этом этапе может возникнуть сразу несколько разных нюансов.
4. Клиент SAS неправильно отображает символы из БД. Это может происходить по нескольким причинам:
Меняем параметры системного файла sas9.cfg. Сначала заходим в sas9.cfg, который лежит по адресу ниже:
!ROOTSASSASHomeSASFoundation9.3
!ROOT — это корень где лежит SAS. Это обычно C:Program Files или просто C:. В общем, то место куда устанавливался SAS.
В этом файле прописан путь к другому sas9.cfg файлу, который нас и интересует. В моём случае это:
-config «C:SASSASHomeSASFoundation9.3nlsu8sasv9.cfg»
 Далее переходим к этому файлу. Обязательно делаем копию этого файла, а далее в конце списка добавляем следующие строки или заменяем те, которые уже как-то есть в списке.
-DBCS
-LOCALE ru_RU
-encoding=utf-8 
Перезапускаем SAS Base и смотрим далее. Если картинка изменилась, но всё равно непонятные символы, то переходим к следующему шагу, иначе сразу к шагу 6.
5. Изменение записей в реестре.
Для правильного отображения меняем параметр NLS_LANG.
Переходим в HKEY_LOCAL_MACHINESOFTWAREoracleKEY_OraClient11g_home1
И далее меняем параметр на AMERICAN_AMERICA.AL32UTF8
Теперь отображение значений должно быть в норме.
6. Последний момент связан с созданием таблиц на стороне БД. Проблема возникает когда примерно следующий код создаёт табличку:
LIBNAME TEST ORACLE <options>;
PROC SQL;
     CREATE TABLE TEST.A
              (X CHAR(250));
QUIT:
А далее делаем
PROC CONTENTS DATA=TEST.A; RUN;
 
Причём, даже если «провалиться» на БД и написать код, то всё равно размерность будет в 4 раза больше.
Вот такую скромную размерность создаёт SAS при работе с Oracle.
Если посмотреть эту же табличку через SQL Developer, то увидим:
Name  Null               Type          
—-       —-                —————
X                               VARCHAR2(1002)
Всё это происходит по тому, что SAS при работе с Unicode увеличивает размер в 4 раза, как на уровне создания таблички, так и на уровне возвращения запроса.
Для того, чтобы данную проблему избежать необходимо указывать следующие параметры при указании библиотек:
LIBNAME TEST ORACLE <options> DBSERVER_MAX_BYTES=1 DBCLIENT_MAX_BYTES=1;
Теперь SQL Developer возвращает:
Name  Null               Type          
—-       —-                —————
X                               VARCHAR2(250)
Если запустить в SAS процедуру CONTENTS, то она уже возвращает:

На этом всё! Спасибо за внимание!

SAS Share, ORACLE library

Всем привет!

В этой статье я поделюсь решением одной из проблем, когда требуется подключить библиотеку из Oracle к SAS Share Server.


В прошлой статье я описал подключение библиотек SAS к Share серверу.

Полагая, что аналогичным образом можно подключить и все другие библиотеки, я попробовал подключить и библиотеку Oracle:

Действуя по тем же шагам, что и делал ранее была создана библиотека Oracle:

Далее:

Далее:

В Advanced Options делаем по аналогии с Base:
 

 Далее создаём новый сервер Oracle:

Далее:

Далее указываем PATH (SID), User Password:


Завершаем установку.

Добавляем эту библиотеку по аналогии с прошлым постом в SAS Share.

Далее перезагружаем SAS Share Server и регистрируем таблички в библиотеке.

На этом этапе появляются варианты: либо проблем нету и всё работает, либо в логах появляются ошибки, о которых пишет SAS MC.

В моём случае появилась не совсем ожидаемая ошибка.
ERROR: Libname oralib is not assigned.
ERROR: Error in the LIBNAME statement

В логах ShareServer видно следующее:
ORACLE connection error: ORA-01017: invalid username/password; logon denied

Озадачило меня то, что эта библиотека прекрасно подключается с аналогичными параметрами к Oracle, если не через SAS Share Server.

Долго проковырявшись в настройках, мне пришла идея добавить в закладку
Properties => Options => Advanced Options => Other Options
следующие параметры: user = «user» password = «password» path =»path»
Где вместо userpasswordpath выставляются соответствующие значения для подключения к необходимой библиотеке Oracle.

После чего всё заработало.

Крепких вам нервов и удачи в работе с SAS SHARE!

p.s.
При написании статьи я подразумевал, что клиент Oracle с указанными tnsnames установлен в системе. Более того, разрядность (x32x64) этого клиента должна соответствовать разрядности SAS.

Передача макропеременных на сторону Oracle

Всем привет!

Данная статья достаточна проста, но она позволяет предостеречь читателей от потерянного времени на поиск ошибки, которая может быть не очевидна.


Допустим была создана макропеременная:
%let id = 1;

Сразу напомню, что макропеременная &id имеет тип char.

Далее мы хотим передать эту переменную в БД Oracle через pass through. В отличии от работы в SAS, кавычки не требуются.
proc sql noprint;
    connect to oracle as myora (user=»example» password=»example» path=example);
         execute (create table example (id number)) by myora;
         execute (insert into example values (&id)) by myora;
    disconnect from myora;
quit;

Как мы можем убедиться, происходит неявное преобразование и в табличку записывается числовое значение.

Но допустим, вам надо поместить это значение в какую-то процедуру?
Например, example.test(id as number).
proc sql noprint;
    connect to oracle as myora (user=»example» password=»example» path=example);
        execute (
            begin
                example.test(&d);
            end;       
            ) by myora;
    disconnect from myora;
quit;

И вроде бы всё нормально, но не происходит вызов процедуры, и не происходит ошибка Oracle.

Проблема опять же, на поверхности. В данном случае, требуется явно преобразовать тип данных, чтобы Oracle считал как необходимый нам тип. Делаем это функцией to_number.

proc sql noprint;
    connect to oracle as myora (user=»example» password=»example» path=example);
        execute (
            begin
                example.test(to_number(&sess_id));
            end;       
            ) by myora;
    disconnect from myora;
quit;

Всё! Спасибо за прочтение!
До скорых встреч!