本文內容來自YashanDB官網,具體內容請見https://www.yashandb.com/newsinfo/7488285.html?templateId=1718516
背景
OCI 是Oracle呼叫介面(Oracle Call Interface 簡稱OCI) 提供了一組對Oracle資料庫進行存取的介面子例程(函式),透過在第三方設計語言(如C語言)中進行呼叫可達到存取ORACLE資料庫的目的。
崖山資料庫基於Oracle的OCI介面,開發了強相容的介面,應用可以做比較少的改動,平滑地遷移到崖山資料庫。
主要優點
1、Oracle資料庫伺服器特性中的即時可用性
2、企業級的效能和可伸縮性
3、強健的安全模型
4、在所有執行Oracle的平臺上的可移植性。
本文將介紹cmake 方式編譯崖山資料庫,幫助讀者快速上手崖山資料庫的OCI介面,並在使用OCI解決實際工作遇到的問題。
環境準備
1、配置yashandb的C驅動 和 OCI 檔案
2、準備Oracle的OCI軟體包,需要下載兩個:
其一是instantclient-basic-linux.x64-21.14.0.0.0dbru.zip,
其二是instantclient-sdk-linux.x64-21.14.0.0.0dbru.zip
3、機器提前安裝GDB和CMAKE工具
如何編譯yashandb的OCI程式碼?
接下來,以官網OCI示例程式碼為例,快速上手編譯Yashandb的OCI程式碼
準備編譯前命令
編輯 CMakeList.txt,它是CMAKE工程編譯的宣告命令檔案
點選檢視程式碼
[yashan103@localhost oci_dir]$ cat CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)
# CMAKE的工程名
project(YAS_OCI_TEST)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(BUILD_USE_64BITS on)
set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "" FORCE)
#設定OCI介面的原始碼路徑
SET(LIBHELLO_SRC
./bb.c
)
#查詢庫檔案
find_library(YAS_OCI_LIBRARY NAMES yas_oci PATHS /home/yashan103/oci_lib/yashandb-oci-23.2.1.100-4-gecc0e02-linux-x86_64)
#確認庫檔案是否找到
if(NOT YAS_OCI_LIBRARY)
message(FATAL_ERROR "Could not find libyas_oci.so")
endif()
# 新增OCI.h的標頭檔案
include_directories(/home/yashan103/instantclient_21_12/sdk/include)
##執行編譯操作
add_executable(YAS_OCI_TEST ${LIBHELLO_SRC})
##新增OCI的yashandb依賴檔案
target_link_libraries(YAS_OCI_TEST ${YAS_OCI_LIBRARY})
[yashan103@localhost oci_dir]$
[yashan103@localhost oci_dir]$
[yashan103@localhost oci_dir]$ cat CMakeLists.txt
cmake_minimum_required(VERSION 2.8.12)
# CMAKE的工程名
project(YAS_OCI_TEST)
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(BUILD_USE_64BITS on)
set(CMAKE_CONFIGURATION_TYPES "Debug" CACHE STRING "" FORCE)
set(CMAKE_BUILD_TYPE "Debug" CACHE STRING "" FORCE)
#設定OCI介面的原始碼路徑
SET(LIBHELLO_SRC
./bb.c
)
#查詢庫檔案
find_library(YAS_OCI_LIBRARY NAMES yas_oci PATHS /home/yashan103/oci_lib/yashandb-oci-23.2.1.100-4-gecc0e02-linux-x86_64)
#確認庫檔案是否找到
if(NOT YAS_OCI_LIBRARY)
message(FATAL_ERROR "Could not find libyas_oci.so")
endif()
# 新增OCI.h的標頭檔案
include_directories(/home/yashan103/instantclient_21_12/sdk/include)
##執行編譯操作
add_executable(YAS_OCI_TEST ${LIBHELLO_SRC})
##新增OCI的yashandb依賴檔案
target_link_libraries(YAS_OCI_TEST ${YAS_OCI_LIBRARY})
點選檢視程式碼
[yashan103@localhost instantclient_21_12]$ ll
total 272500
-rwxr-xr-x. 1 yashan103 yashan103 42192 Dec 21 2023 adrci
-rw-r--r--. 1 yashan103 yashan103 5780 Dec 21 2023 BASIC_LICENSE
-rw-r--r--. 1 yashan103 yashan103 1634 Dec 21 2023 BASIC_README
drwxrwxr-x. 2 yashan103 yashan103 55 Apr 1 10:46 bin
-rwxr-xr-x. 1 yashan103 yashan103 59544 Dec 21 2023 genezi
drwxrwxr-x. 2 yashan103 yashan103 6 Aug 5 21:38 include
drwxrwxr-x. 2 yashan103 yashan103 6 Aug 5 21:38 lib
lrwxrwxrwx. 1 yashan103 yashan103 21 Jul 23 11:22 libclntshcore.so -> libclntshcore.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 21 Jul 23 11:22 libclntshcore.so.12.1 -> libclntshcore.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 21 Jul 23 11:22 libclntshcore.so.18.1 -> libclntshcore.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 21 Jul 23 11:22 libclntshcore.so.19.1 -> libclntshcore.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 21 Jul 23 11:22 libclntshcore.so.20.1 -> libclntshcore.so.21.1
-rwxr-xr-x. 1 yashan103 yashan103 8108592 Dec 21 2023 libclntshcore.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 17 Jul 23 11:22 libclntsh.so -> libclntsh.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 17 Jul 23 11:22 libclntsh.so.10.1 -> libclntsh.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 17 Jul 23 11:22 libclntsh.so.11.1 -> libclntsh.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 17 Jul 23 11:22 libclntsh.so.12.1 -> libclntsh.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 17 Jul 23 11:22 libclntsh.so.18.1 -> libclntsh.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 17 Jul 23 11:22 libclntsh.so.19.1 -> libclntsh.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 17 Jul 23 11:22 libclntsh.so.20.1 -> libclntsh.so.21.1
-rwxr-xr-x. 1 yashan103 yashan103 84191392 Dec 21 2023 libclntsh.so.21.1
-rw-r--r--. 1 yashan103 yashan103 3412144 Apr 1 10:46 libcrypto.so.1.1
lrwxrwxrwx. 1 yashan103 yashan103 14 Apr 1 10:46 libcsvexp.so -> libcsvexp.so.0
lrwxrwxrwx. 1 yashan103 yashan103 20 Apr 1 10:46 libcsvexp.so.0 -> libcsvexp.so.1.1.100
-rwxr-xr-x. 1 yashan103 yashan103 241088 Apr 1 10:46 libcsvexp.so.1.1.100
lrwxrwxrwx. 1 yashan103 yashan103 15 Apr 1 10:46 liblz4.so -> liblz4.so.1.9.3
lrwxrwxrwx. 1 yashan103 yashan103 15 Apr 1 10:46 liblz4.so.1 -> liblz4.so.1.9.3
-rw-r--r--. 1 yashan103 yashan103 236216 Apr 1 10:46 liblz4.so.1.9.3
-rwxr-xr-x. 1 yashan103 yashan103 5844176 Dec 21 2023 libnnz21.so
lrwxrwxrwx. 1 yashan103 yashan103 21 Jul 23 11:22 libocci_gcc53.so -> libocci_gcc53.so.21.1
-rwxr-xr-x. 1 yashan103 yashan103 956832 Dec 21 2023 libocci_gcc53.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 15 Jul 23 11:22 libocci.so -> libocci.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 15 Jul 23 11:22 libocci.so.10.1 -> libocci.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 15 Jul 23 11:22 libocci.so.11.1 -> libocci.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 15 Jul 23 11:22 libocci.so.12.1 -> libocci.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 15 Jul 23 11:22 libocci.so.18.1 -> libocci.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 15 Jul 23 11:22 libocci.so.19.1 -> libocci.so.21.1
lrwxrwxrwx. 1 yashan103 yashan103 15 Jul 23 11:22 libocci.so.20.1 -> libocci.so.21.1
-rwxr-xr-x. 1 yashan103 yashan103 2374808 Dec 21 2023 libocci.so.21.1
-rwxr-xr-x. 1 yashan103 yashan103 142717504 Dec 21 2023 libociei.so
-r-xr-xr-x. 1 yashan103 yashan103 153600 Dec 21 2023 libocijdbc21.so
-rwxr-xr-x. 1 yashan103 yashan103 116208 Dec 21 2023 liboramysql.so
-rw-r--r--. 1 yashan103 yashan103 771118 Apr 1 10:46 libpcre2-8.a
lrwxrwxrwx. 1 yashan103 yashan103 20 Apr 1 10:46 libpcre2-8.so -> libpcre2-8.so.0.10.4
lrwxrwxrwx. 1 yashan103 yashan103 20 Apr 1 10:46 libpcre2-8.so.0 -> libpcre2-8.so.0.10.4
-rw-r--r--. 1 yashan103 yashan103 383080 Apr 1 10:46 libpcre2-8.so.0.10.4
lrwxrwxrwx. 1 yashan103 yashan103 13 Apr 1 10:46 libssl.so -> libssl.so.1.1
-rw-r--r--. 1 yashan103 yashan103 693200 Apr 1 10:46 libssl.so.1.1
lrwxrwxrwx. 1 yashan103 yashan103 14 Apr 1 10:46 libyascli.so -> libyascli.so.0
lrwxrwxrwx. 1 yashan103 yashan103 20 Apr 1 10:46 libyascli.so.0 -> libyascli.so.1.1.100
-rwxr-xr-x. 1 yashan103 yashan103 2699208 Apr 1 10:46 libyascli.so.1.1.100
lrwxrwxrwx. 1 yashan103 yashan103 17 Apr 1 10:46 libyas_infra.so -> libyas_infra.so.0
lrwxrwxrwx. 1 yashan103 yashan103 23 Apr 1 10:46 libyas_infra.so.0 -> libyas_infra.so.1.1.100
-rwxr-xr-x. 1 yashan103 yashan103 11305496 Apr 1 10:46 libyas_infra.so.1.1.100
-rwxrwxr-x. 1 yashan103 yashan103 597808 Aug 5 22:04 libyas_oci.so
-rwxr-xr-x. 1 yashan103 yashan103 408008 Apr 1 10:46 libyex_client.so
lrwxrwxrwx. 1 yashan103 yashan103 16 Apr 1 10:46 libzstd.so -> libzstd.so.1.5.2
lrwxrwxrwx. 1 yashan103 yashan103 16 Apr 1 10:46 libzstd.so.1 -> libzstd.so.1.5.2
-rw-r--r--. 1 yashan103 yashan103 1159832 Apr 1 10:46 libzstd.so.1.5.2
drwxr-xr-x. 3 yashan103 yashan103 19 Dec 21 2023 network
-rw-r--r--. 1 yashan103 yashan103 5245454 Dec 21 2023 ojdbc11.jar
-rw-r--r--. 1 yashan103 yashan103 5153068 Dec 21 2023 ojdbc8.jar
drwxr-xr-x. 5 yashan103 yashan103 79 Dec 21 2023 sdk
-rw-r--r--. 1 yashan103 yashan103 5780 Dec 21 2023 SDK_LICENSE
-rw-rw-r--. 1 yashan103 yashan103 1628 Dec 21 2023 SDK_README
-rw-r--r--. 1 yashan103 yashan103 1805644 Dec 21 2023 ucp.jar
-rwxr-xr-x. 1 yashan103 yashan103 236176 Dec 21 2023 uidrvci
-rw-r--r--. 1 yashan103 yashan103 31869 Dec 21 2023 xstreams.jar
-rw-r--r--. 1 yashan103 yashan103 20076 Apr 1 10:46 yacli.h
準備Yashandb OCI 依賴檔案
點選檢視程式碼
[yashan103@localhost yashandb-oci-23.2.1.100-4-gecc0e02-linux-x86_64]$ pwd
/home/yashan103/oci_lib/yashandb-oci-23.2.1.100-4-gecc0e02-linux-x86_64
[yashan103@localhost yashandb-oci-23.2.1.100-4-gecc0e02-linux-x86_64]$ ll
total 600
-rwxrwxr-x. 1 yashan103 yashan103 597808 Jul 8 17:14 libyas_oci.so
-rwxrwxr-x. 1 yashan103 yashan103 13576 Jul 8 17:14 yasociconntest
執行編譯命令
點選檢視程式碼
[yashan103@localhost oci_dir]$ ll
total 32
-rw-rw-r--. 1 yashan103 yashan103 4534 Aug 5 23:03 bb.c
drwxrwxr-x. 5 yashan103 yashan103 4096 Aug 5 22:25 CMakeFiles
-rw-rw-r--. 1 yashan103 yashan103 861 Aug 5 23:05 CMakeLists.txt
-rwxrwxr-x. 1 yashan103 yashan103 15896 Aug 5 22:25 YAS_OCI_TEST
[yashan103@localhost oci_dir]$ cmake -B build .
-- Configuring done
-- Generating done
-- Build files have been written to: /home/yashan103/oci_dir
[yashan103@localhost oci_dir]$ make
Scanning dependencies of target YAS_OCI_TEST
[ 50%] Building C object CMakeFiles/YAS_OCI_TEST.dir/bb.c.o
[100%] Linking C executable YAS_OCI_TEST
[100%] Built target YAS_OCI_TEST
執行二進位制軟體
點選檢視程式碼
[yashan103@localhost oci_dir]$ ./YAS_OCI_TEST
test succeed!
以一個OCI程式碼解釋程式碼常用語法的含義
點選檢視程式碼
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <oci.h>
// 呼叫OCI程式碼的CALL函式
#define OCI_TEST_CALL(ociFunc) \
do { \
sword r = ociFunc; \
if (r != OCI_SUCCESS) { \
checkerr(errhp, r); \
return r; \
} \
} while (0)
static text* username = (text*)"sys";
static text* password = (text*)"Cod-2022";
static text* dbname = (text*)"CITEST";
static OCIEnv* envhp = NULL;
static OCIError* errhp = NULL;
static OCISvcCtx* svchp = NULL;
static OCISession* authp = NULL;
static OCIServer* srvhp = NULL;
// ## 檢查程式碼執行是否返回異常的函式
void checkerr(OCIError* errhp, sword status)
{
text errbuf[512];
sb4 errcode = 0;
// 根據status 判斷OCI執行結果狀態
switch (status) {
case OCI_SUCCESS:
break;
case OCI_SUCCESS_WITH_INFO:
(void)printf("Error - OCI_SUCCESS_WITH_INFO\n");
break;
case OCI_NEED_DATA:
(void)printf("Error - OCI_NEED_DATA\n");
break;
case OCI_NO_DATA:
(void)printf("Error - OCI_NODATA\n");
break;
case OCI_ERROR:
(void)OCIErrorGet((dvoid*)errhp, (ub4)1, (text*)NULL, &errcode, errbuf, (ub4)sizeof(errbuf),
OCI_HTYPE_ERROR);
(void)printf("Error - %.*s\n", 512, errbuf);
break;
case OCI_INVALID_HANDLE:
(void)printf("Error - OCI_INVALID_HANDLE\n");
break;
case OCI_STILL_EXECUTING:
(void)printf("Error - OCI_STILL_EXECUTE\n");
break;
case OCI_CONTINUE:
(void)printf("Error - OCI_CONTINUE\n");
break;
default:
break;
}
}
// 單行繫結匯入資料
sword testSingleBind()
{
OCIStmt* stmthp = NULL;
// 申請一個控制代碼
(void)OCIHandleAlloc((dvoid*)envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);
OCIBind* bindp1 = NULL;
OCIDefine* definep1 = NULL;
ub4 intOut1[3] = {0, 1, 2};
OraText* sql = "drop table if exists tbl_bind";
// 類似JDBC的prepare statement
//在 OCI(Oracle Call Interface)中,ub4 是 Oracle C 資料型別之一,它代表一個無符號的 4 位元組(32位)整數。OCI 是 Oracle 資料庫提供的程式設計介面,允許開發者使用 C 或 C++ 編寫可以與 Oracle 資料庫互動的程式。
OCI_TEST_CALL(OCIStmtPrepare(stmthp, errhp, sql, (ub4)strlen((char*)sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT));
// 類似JDBC的執行
OCI_TEST_CALL(OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, NULL, NULL, OCI_DEFAULT));
sql = "create table tbl_bind(col1 int, col2 varchar(20))";
OCI_TEST_CALL(OCIStmtPrepare(stmthp, errhp, sql, (ub4)strlen((char*)sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT));
OCI_TEST_CALL(OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, NULL, NULL, OCI_DEFAULT));
sql = "insert into tbl_bind values (:1, '11')";
OCI_TEST_CALL(OCIStmtPrepare(stmthp, errhp, sql, (ub4)strlen((char*)sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT));
OCI_TEST_CALL(OCIBindByPos(stmthp, &bindp1, errhp, (ub4)1, (dvoid*)intOut1, (sb4)sizeof(ub4), SQLT_INT, 0, 0, 0, 0, NULL, OCI_DEFAULT));
OCI_TEST_CALL(OCIStmtExecute(svchp, stmthp, errhp, (ub4)3, (ub4)0, NULL, NULL, OCI_DEFAULT));
ub4 rowcnt;
OCI_TEST_CALL(OCIAttrGet((CONST dvoid*)stmthp, (ub4)OCI_HTYPE_STMT, (void*)&rowcnt, (ub4*)0, (ub4)OCI_ATTR_ROW_COUNT, errhp));
if (rowcnt != 3) {
return OCI_ERROR;
}
// 單行取資料
sql = "select col1 + 99 from tbl_bind";
OCI_TEST_CALL(OCIStmtPrepare(stmthp, errhp, sql, (ub4)strlen((char*)sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT));
OCI_TEST_CALL(OCIDefineByPos(stmthp, &definep1, errhp, (ub4)1, (dvoid*)intOut1, (sb4)sizeof(ub4), SQLT_INT, 0, 0, 0, OCI_DEFAULT));
OCI_TEST_CALL(OCIStmtExecute(svchp, stmthp, errhp, (ub4)3, (ub4)0, NULL, NULL, OCI_DEFAULT));
if (intOut1[0] != 99 || intOut1[1] != 100 || intOut1[2] != 101) {
return OCI_ERROR;
}
//釋放控制代碼
(void)OCIHandleFree((dvoid*)stmthp, (ub4)OCI_HTYPE_STMT);
return OCI_SUCCESS;
}
// 批次繫結匯入資料
sword testBatchBind()
{
OCIStmt* stmthp = NULL;
(void)OCIHandleAlloc((dvoid*)envhp, (dvoid**)&stmthp, OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);
OCIBind* bindp = NULL;
OCIDefine* definep = NULL;
sb1 intIn1[4];
sb2 ind1[4];
ub2 rlen1[4];
OraText* sql = "drop table if exists tbl_bind";
OCI_TEST_CALL(OCIStmtPrepare(stmthp, errhp, sql, (ub4)strlen((char*)sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT));
OCI_TEST_CALL(OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, NULL, NULL, OCI_DEFAULT));
sql = "create table tbl_bind(col1 bigint)";
OCI_TEST_CALL(OCIStmtPrepare(stmthp, errhp, sql, (ub4)strlen((char*)sql), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT));
OCI_TEST_CALL(OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0, NULL, NULL, OCI_DEFAULT));
intIn1[0] = 0;
intIn1[1] = 1;
intIn1[2] = 2;
ind1[0] = 0;
ind1[1] = 0;
ind1[2] = 0;
rlen1[0] = 1;
rlen1[1] = 1;
rlen1[2] = 1;
OraText* sql1 = "insert into tbl_bind values (:1)";
OCI_TEST_CALL(OCIStmtPrepare(stmthp, errhp, sql1, (ub4)strlen((char*)sql1), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT));
OCI_TEST_CALL(OCIBindByPos(stmthp, &bindp, errhp, (ub4)1, (dvoid*)intIn1, (sb4)sizeof(sb1), SQLT_INT, ind1, rlen1, 0, 0, NULL, OCI_DEFAULT));
OCI_TEST_CALL(OCIStmtExecute(svchp, stmthp, errhp, (ub4)3, (ub4)0, NULL, NULL, OCI_DEFAULT));
// 批次取資料
OraText* sql2 = "select col1 from tbl_bind order by rowid";
OCI_TEST_CALL(OCIStmtPrepare(stmthp, errhp, sql2, (ub4)strlen((char*)sql2), (ub4)OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT));
OCI_TEST_CALL(OCIDefineByPos(stmthp, &definep, errhp, (ub4)1, (dvoid*)intIn1, (sb4)sizeof(sb1), SQLT_INT, ind1, rlen1, 0, OCI_DEFAULT));
OCI_TEST_CALL(OCIStmtExecute(svchp, stmthp, errhp, (ub4)3, (ub4)0, NULL, NULL, OCI_DEFAULT));
if (intIn1[0] != 0 || intIn1[1] != 1 || intIn1[2] != 2) {
return OCI_ERROR;
}
if (ind1[0] != 0 || ind1[1] != 0 || ind1[2] != 0) {
return OCI_ERROR;
}
if (rlen1[0] != 1 || rlen1[1] != 1 || rlen1[2] != 1) {
return OCI_ERROR;
}
(void)OCIHandleFree((dvoid*)stmthp, (ub4)OCI_HTYPE_STMT);
return OCI_SUCCESS;
}
// 連線資料庫
sword testConnect()
{
sword errcode = 0;
errcode = OCIEnvCreate((OCIEnv**)&envhp, (ub4)OCI_THREADED, (dvoid*)0, (dvoid * (*)(dvoid*, size_t))0,
(dvoid * (*)(dvoid*, dvoid*, size_t))0, (void (*)(dvoid*, dvoid*))0, (size_t)0, (dvoid**)0);
if (errcode != 0) {
(void)printf("OCIEnvCreate failed with errcode = %d.\n", errcode);
return OCI_ERROR;
}
(void)OCIHandleAlloc((dvoid*)envhp, (dvoid**)&errhp, OCI_HTYPE_ERROR, (size_t)0, (dvoid**)0);
(void)OCIHandleAlloc((dvoid*)envhp, (dvoid**)&svchp, OCI_HTYPE_SVCCTX, (size_t)0, (dvoid**)0);
(void)OCIHandleAlloc((dvoid*)envhp, (dvoid**)&srvhp, OCI_HTYPE_SERVER, (size_t)0, (dvoid**)0);
OCI_TEST_CALL(OCIServerAttach(srvhp, errhp, (text*)dbname, (sb4)strlen((char*)dbname), 0));
(void)OCIAttrSet((dvoid*)svchp, OCI_HTYPE_SVCCTX, (dvoid*)srvhp, (ub4)0, OCI_ATTR_SERVER, (OCIError*)errhp);
(void)OCIHandleAlloc((dvoid*)envhp, (dvoid**)&authp, (ub4)OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0);
(void)OCIAttrSet((dvoid*)authp, (ub4)OCI_HTYPE_SESSION, (dvoid*)username, (ub4)strlen((char*)username), (ub4)OCI_ATTR_USERNAME, errhp);
(void)OCIAttrSet((dvoid*)authp, (ub4)OCI_HTYPE_SESSION, (dvoid*)password, (ub4)strlen((char*)password), (ub4)OCI_ATTR_PASSWORD, errhp);
OCI_TEST_CALL(OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, (ub4)OCI_DEFAULT));
(void)OCIAttrSet((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX, (dvoid*)authp, (ub4)0, (ub4)OCI_ATTR_SESSION, errhp);
return OCI_SUCCESS;
}
// 關閉資料庫連線
sword testDisconnect()
{
OCI_TEST_CALL(OCISessionEnd(svchp, errhp, authp, (ub4)0));
OCI_TEST_CALL(OCIServerDetach(srvhp, errhp, (ub4)OCI_DEFAULT));
(void)OCIHandleFree((dvoid*)authp, (ub4)OCI_HTYPE_SESSION);
(void)OCIHandleFree((dvoid*)srvhp, (ub4)OCI_HTYPE_SERVER);
(void)OCIHandleFree((dvoid*)svchp, (ub4)OCI_HTYPE_SVCCTX);
(void)OCIHandleFree((dvoid*)errhp, (ub4)OCI_HTYPE_ERROR);
(void)OCIHandleFree((dvoid*)envhp, (ub4)OCI_HTYPE_ENV);
return OCI_SUCCESS;
}
sword runTest()
{
if (testConnect() != OCI_SUCCESS) {
return 1;
}
if (testSingleBind() != OCI_SUCCESS) {
return 2;
}
if (testBatchBind() != OCI_SUCCESS) {
return 3;
}
if (testDisconnect() != OCI_SUCCESS) {
return 5;
}
return 0;
}
int main(argc, argv)
int argc;
char* argv[];
{
sword runResult = runTest();
if (runResult == 0) {
printf("test succeed!\n");
} else {
printf("test failed! failed test num : %d\n", runResult);
}
return runResult;
}
https://www.yashandb.com/newsinfo/7488285.html?templateId=1718516