개요
Oracle Call Interface(이하 OCI) 라이브러리를 사용해 windows 환경에서 Tibero 서버와 연결하는 방법을
안내 합니다.
참고
아래와 같은 환경에서 테스트를 진행하였습니다.
•
OS: Windows 10 (64 bit)
•
DB: Tibero 6 FS06
•
IDE: VS 2017
방법
OCI 설치
1. OCI 라이브러리 복사
Tibero 바이너리 안에 포함된 라이브러리 파일(%TB_HOME%binlibtboci.lib, %TB_HOME%binlibtboci.dll)을 사용할 클라이언트 윈도우로 복사합니다.
주의
Tibero 바이너리의 32/64 bit 버전에 따라 해당 라이브러리만 빌드되어 있습니다.
컴파일 하고자 하는 application의 플랫폼 bit에 맞추어 동일 bit 의 바이너리에서 복사합니다.
2. Oracle OCI header 복사
$ORACLE_HOME/rdbms/public 폴더 내 위치한 .h 파일들을 사용할 클라이언트 윈도우로 복사합니다.
3. 환경설정 추가
a.
[프로젝트]-[속성] 에서 속성 페이지의 [C/C++]-[일반] 탭에 라이브러리 및 헤더 파일 디렉터리를 추가합니다.
b. [링커]-[일반] 탭에서 추가 라이브러리 디렉터리를 설정합니다.
c. [링커]-[입력] 탭에서 tibero oci 라이브러리를 종속성에 추가합니다.
OCI 활용한 Tibero 작업
1. OCI header 추가
#include “oci.h”
SQL
복사
2. OCI 오브젝트 Initialize
static OCIEnv *p_env;
static OCIError *p_err;
static OCISvcCtx *p_svc;
static OCIStmt *p_sql;
static OCIDefine *p_dfn = (OCIDefine *)0;
static OCIBind *p_bnd = (OCIBind *)0;
int p_bvi;
char p_sli[20];
int rc;
OraText errbuf[100];
int errcode;
rc = OCIInitialize((ub4)OCI_DEFAULT, (dvoid )0, / Initialize OCI */
(dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t))0,
(void(*)(dvoid *, dvoid *)) 0);
/* Initialize evironment */
rc = OCIEnvInit((OCIEnv **)&p_env, OCI_DEFAULT, (size_t)0, (dvoid **)0);
/* Initialize handles */
rc = OCIHandleAlloc((dvoid *)p_env, (dvoid **)&p_err, OCI_HTYPE_ERROR,
(size_t)0, (dvoid **)0);
rc = OCIHandleAlloc((dvoid *)p_env, (dvoid **)&p_svc, OCI_HTYPE_SVCCTX,
(size_t)0, (dvoid **)0);
SQL
복사
3. Tibero database 연결
계정, 데이터베이스 정보를 입력합니다.
참고
버전에 따라 스트링 데이터(char)는 오라클 정의 타입(OraText)으로 캐스팅함으로써 컴파일 가능합니다.
/* Connect to database server */
rc = OCILogon(p_env, p_err, &p_svc, (OraText)”sys”, 3, (OraText)”tibero”, 6,
(OraText*)”tibero”, 6);
if (rc != 0) {
OCIErrorGet((dvoid *)p_err, (ub4)1, (text *)NULL, &errcode, errbuf, (ub4)
sizeof(errbuf), OCI_HTYPE_ERROR);
printf("Error - %.*sn", 512, errbuf);
exit(8);
}
SQL
복사
4. SQL(select) 전처리
/* Allocate and prepare SQL statement */
rc = OCIHandleAlloc((dvoid *)p_env, (dvoid **)&p_sql,
OCI_HTYPE_STMT, (size_t)0, (dvoid **)0);
rc = OCIStmtPrepare(p_sql, p_err, (OraText*)”select * from dual”,
(ub4)37, (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);
SQL
복사
5. SQL(select) 실행 및 결과 출력
/* Execute the SQL statment */
rc = OCIStmtExecute(p_svc, p_sql, p_err, (ub4)1, (ub4)0,
(CONST OCISnapshot *) NULL, (OCISnapshot *)NULL, OCI_DEFAULT);
while (rc != OCI_NO_DATA) { /* Fetch the remaining data */
printf("%s", p_sli);
rc = OCIStmtFetch(p_sql, p_err, 1, 0, 0);
}
SQL
복사
6. SQL(insert) 전처리
/* sql prepare */
rc = OCIStmtPrepare(p_sql, p_err, (OraText*)”insert into test values(‘dummy’, 100);”,
(ub4)37, (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT);
SQL
복사
7. SQL(insert) 실행 및 결과 확인
OCI_COMMIT_ON_SUCCESS 모드로 설정 시, 쿼리가 성공적으로 적용된다면 자동으로 COMMIT을 수행합니다.
rc = OCIStmtExecute(p_svc, p_sql, p_err, (ub4)1, (ub4)0,
(CONST OCISnapshot *) NULL, (OCISnapshot *)NULL, OCI_COMMIT_ON_SUCCESS);
SQL
복사