SAS/ACCESS Interface to Oracle 라이선스. 없으면 Oracle LIBNAME 이 동작하지 않는다.proc product_status;
run;
Windows 의 시스템 속성에서 설정한다.
| 변수 | 값 |
|---|---|
PATH |
Instant Client 디렉터리. 예: C:\oracle\instantclient_19_x |
TNS_ADMIN |
tnsnames.ora 가 있는 디렉터리 |
NLS_LANG |
KOREAN_KOREA.AL32UTF8 등. 세션 인코딩에 맞춘다 |
리눅스에서는 LD_LIBRARY_PATH 와 ORACLE_HOME 을 함께 설정한다.
환경 변수를 바꾼 뒤에는 SAS 서비스(Object Spawner, Workspace Server, 스케줄러)를 다시 띄워야 반영된다. 사용자 환경 변수에만 넣으면 서비스 계정으로 뜨는 SAS 에는 적용되지 않는다. 시스템 환경 변수로 넣는다.
ORCLPDB1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = <db-host>)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = <service-name>)
)
)
파일은 BOM 없이 저장하고 alias 철자를 정확히 맞춘다.
/* TNS alias */
libname oradb oracle
user=<db-user>
password="${PASSWORD}"
path=ORCLPDB1
schema=<schema>;
/* EZCONNECT */
libname oradb oracle
user=<db-user>
password="${PASSWORD}"
path="<db-host>:1521/<service-name>"
schema=<schema>;
/* SID */
libname oradb oracle
user=<db-user>
password="${PASSWORD}"
path="<db-host>:1521:<sid>"
schema=<schema>;
연결 확인은 다음으로 한다.
proc datasets lib=oradb nolist;
quit;
proc sql;
select * from oradb.emp(obs=10);
quit;
proc pwencode in='<password>' method=sas003;
run;
로그에 나온 {SAS003} 로 시작하는 문자열을 그대로 쓴다.
libname oradb oracle
user=<db-user>
password="{SAS003}<encoded>"
path=ORCLPDB1
schema=<schema>;
여러 사용자가 함께 쓰는 환경이라면 SMC 에서 라이브러리를 등록하고 계정 정보를 인증 도메인에 보관한다.
SAS Management Console
-> Data Library Manager -> Libraries -> New Library
-> Library Type: Oracle
-> Name / Libref 지정, Server Context 선택
-> Data Source(Connection) 생성: Path, User/Password 또는 Authentication Domain
등록하면 EG 와 DI Studio 에서 바로 보인다. 본인만 쓰는 임시 작업이면 LIBNAME 문이 빠르고, 여러 사용자가 공용으로 쓰면 SMC 등록이 관리에 낫다.
libname oradb oracle
user=<db-user>
password="{SAS003}<encoded>"
path=ORCLPDB1
schema=<schema>
preserve_tab_names=yes
preserve_col_names=yes
dbcommit=10000;
문제 추적이 필요하면 드라이버 트레이스를 잠깐 켠다.
options sastrace=',,,d' sastraceloc=saslog nosource;
libname oradb oracle user=... password=... path=ORCLPDB1;
options sastrace=off;
원인은 둘이다.
첫째, 인코딩 불일치다. 세션 인코딩과 Oracle 클라이언트의 NLS_LANG, DB 문자셋이 어긋나면 한글 이름이 깨지거나 보이지 않는다.
proc options option=encoding;
run;
%put NOTE: NLS_LANG=%sysget(NLS_LANG);
SELECT parameter, value
FROM nls_database_parameters
WHERE parameter IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
둘째, 따옴표 식별자다. Oracle 에서 따옴표로 만든 한글·소문자·공백 이름은 SAS 에서 이름 리터럴로 접근해야 한다.
libname oradb oracle
user=<db-user> password="${PASSWORD}" path=ORCLPDB1 schema=<schema>
preserve_tab_names=yes preserve_col_names=yes;
proc contents data=oradb.'매출_집계'n;
run;
proc sql;
select '거래일자'n, '금액'n
from oradb.'매출_집계'n;
quit;
리터럴을 쓰지 않으면 SAS 가 대문자로 바꿔 조회하면서 ORA-00942: table or view does not exist 가 난다.
특정 사용자만 문제라면 그 사용자의 세션 인코딩과 워크스페이스, 환경 변수 반영 여부를 본다.
| 오류 | 원인 |
|---|---|
Unable to connect to Oracle - Oracle environment is either not set or set incorrectly! |
Oracle Client 미설치, PATH 누락, 비트 수 불일치 |
oci.dll 로드 실패 |
32비트와 64비트 혼재. where oci.dll 로 실제 로딩 경로 확인 |
| ORA-12154 | TNS_ADMIN 경로 또는 alias 철자 |
| ORA-12514 | SERVICE_NAME 오기, PDB 미오픈, 리스너 구성 |
| ORA-12541 | 호스트·포트, 방화벽 |
| 한글 깨짐 | NLS_LANG, 세션 인코딩 |
Visual C++ 재배포 패키지가 없으면 Instant Client 의 DLL 로딩이 실패하면서 환경 설정 오류처럼 보일 수 있다.
TNS 문제인지 드라이버 로딩 문제인지 가르려면 EZCONNECT 로 한 번 붙여 본다. EZCONNECT 가 되면 tnsnames.ora 문제이고, 그것도 안 되면 드라이버 쪽이다.