Настройка работы 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 указываем параметры доступа к нашей БД.
Примерно по следующему пути можно найти необходимый файл:
С:\APP\PRODUCT\11.2.0\CLIENT_1\NETWORK\ADMIN\
В 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, который лежит по адресу ниже:
!ROOT\SAS\SASHome\SASFoundation\9.3\
!ROOT - это корень где лежит SAS. Это обычно C:\Program Files\ или просто C:\. В общем, то место куда устанавливался SAS.

В этом файле прописан путь к другому sas9.cfg файлу, который нас и интересует. В моём случае это:
-config "C:\SAS\SASHome\SASFoundation\9.3\nls\u8\sasv9.cfg"

 Далее переходим к этому файлу. Обязательно делаем копию этого файла, а далее в конце списка добавляем следующие строки или заменяем те, которые уже как-то есть в списке.
-DBCS
-LOCALE ru_RU
-encoding=utf-8 

Перезапускаем SAS Base и смотрим далее. Если картинка изменилась, но всё равно непонятные символы, то переходим к следующему шагу, иначе сразу к шагу 6.

5. Изменение записей в реестре.
Для правильного отображения меняем параметр NLS_LANG.
Переходим в HKEY_LOCAL_MACHINE\SOFTWARE\oracle\KEY_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, то она уже возвращает:


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

Ярлыки: ,