【YashanDB知識庫】YashanDB-OCI-快速上手

来源:https://www.cnblogs.com/YashanDB/p/18435683
-Advertisement-
Play Games

本文內容來自YashanDB官網,具體內容請見https://www.yashandb.com/newsinfo/7488285.html?templateId=1718516 背景 OCI 是Oracle調用介面(Oracle Call Interface 簡稱OCI) 提供了一組對Oracle數 ...


本文內容來自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})
準備Oracle的依賴文件
點擊查看代碼
[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


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文作者:YashanDB高級服務工程師周國超 YashanDB共用集群是崖⼭資料庫系統(YashanDB)的⼀個關鍵特性,它是⼀個單庫多實例的多活資料庫系統。⽤⼾可以連接到任意實例訪問同⼀個資料庫,多個資料庫實例能夠併發讀寫同⼀份數據,同時保證實例之間讀寫的強⼀致性。這種設計賦予了系統⾼可⽤性、⾼ ...
  • 參考官網鏈接:https://docs-opengauss.osinfra.cn/zh/docs/5.0.0/docs/InstallationGuide/%E5%8D%95%E8%8A%82%E7%82%B9%E5%AE%89%E8%A3%85.html 其中安裝版本為 5.0,操作系統為 ope ...
  • 1. 結構化數據 1.1. 結構化數據是數據湖倉中最常見的基礎數據之一 1.1.1. 是技術領域中最早出現的數據環境之一 1.2. 每條記錄的結構都是相同的,即便不同記錄中的內容可能不同,但數據的基本佈局完全一樣 1.3. 結構化數據環境都經過了優化,電腦能以最優的方式處理結構化數據 1.4. 很 ...
  • 本文內容來自YashanDB官網,具體內容請見(https://www.yashandb.com/newsinfo/7488286.html?templateId=1718516) 測試驗證環境說明 測試用例說明 1、相同版本下,新增表數據量,使統計信息失效。優化器優先使用outline的計劃。 2 ...
  • PostgreSQL的流複製,從整體上看,可以粗分為同步與非同步兩種模式,其中涉及的主要參數包括synchronous_commit和synchronous_standby_names 主節點synchronous_commit參數設置 synchronous_commit事務提交模式,類似於MySQ ...
  • 本文是翻譯A graph a day, keeps the doctor away ! – MySQL History List Length[1]這篇文章,翻譯如有不當的地方,敬請諒解,請尊重原創和翻譯勞動成果,轉載的時候請註明出處。謝謝! 這是MySQL趨勢系列文章的第二篇。 正如我之前所寫,了 ...
  • 1. 不同類型的數據 1.1. 不同類型的數據在存儲方面有各自的特性,這些特性極大地影響了數據在數據湖倉中的存儲和使用方式 1.2. 結構化數據 1.2.1. 在企業等組織中,只有少量的數據是結構化數據 1.2.2. 結構化數據是基於事務的數據,是組織日常業務的副產品 1.3. 文本數據 1.3.1 ...
  • 目錄表的增刪改查Create指定列插入單行數據+全列插入多行數據+全列插入插入否則更新替換 (replace)Retrieve標準語法SELECT列全列查詢限制顯示條目 limit (分頁查詢)基本語法:指定列查詢select 查詢欄位為表達式表達式重命名去重WHERE 條件比較運算符邏輯運算符案例 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...