【YashanDB知识库】YashanDB-OCI-快速上手

简介: 【YashanDB知识库】YashanDB-OCI-快速上手

背景

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

相关文章
|
22天前
|
SQL 存储 关系型数据库
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
|
5天前
|
SQL 测试技术 数据库
【YashanDB知识库】IMP跨网络导入慢问题
问题现象:290M数据,本地导入2分钟,跨机导入耗时显著增加(最高30分钟)。 原因分析:`imp`逐条SQL通过网络传输至yashanDB执行,交互频繁导致性能下降。 影响版本:客户测试环境22.2.8.3。 解决方法:将导入文件上传至与yashanDB同机后使用`imp`,减少网络延迟。 经验总结:优化`imp`工具,支持直接上传文件至服务器端执行,降低网络依赖。
|
5天前
|
监控 数据库
【YashanDB 知识库】ycm 托管数据库时报错 OM host ip:127.0.0.1 is not support join to YCM
在托管数据库时,若 OM 的 IP 被设置为 127.0.0.1,将导致无法托管至 YCM,并使数据库失去监控。此问题源于安装时修改了 OM 的监听 IP。解决方法包括:将 OM 的 IP 修改为本机实际 IP 或 0.0.0.0,同时更新 env 文件及 yasom 后台数据库中的相关配置。经验总结指出,应避免非必要的后台 IP 修改,且数据库安装需遵循规范,不使用仅限本机访问的 IP(如 127.0.0.1)。
|
5天前
|
监控 网络安全 数据库
YashanDB 知识库:ycm 纳管主机安装 YCM-AGENT 时报错 “任务提交失败,无法连接主机”
在安装 ycm-agent 纳管主机时,可能出现因端口未开放导致的报错问题。此问题会阻止 YCM 对主机和数据库的监控功能,影响版本为 `yashandb-cloud-manager-23.2.1.100-linux-aarch64.tar`。原因是目标主机(如 10.149.223.121)未开放 9070 或 9071 端口。解决方法包括关闭防火墙、添加白名单或开放指定端口,需与管理员确认操作。处理过程涉及网络检查、端口测试等步骤。端口问题解决后,若再次安装报唯一键错误,需先移除失败主机再重试。
|
5天前
|
监控 Java Shell
【YashanDB 知识库】ycm 托管数据库时,数据库非 OM 安装无法托管
本文主要介绍了因数据库未按规范使用 yasboot 安装导致的问题及解决方法。问题表现为无 yasom 和 yasagent 进程,且目录结构缺失,致使 ycm 无法托管与监控。分析发现可能是数据库版本旧或安装不规范引起。解决方法为先生成配置文件,安装 yasom 和 yasagent,再生成并修改托管配置模板,最终通过命令完成托管至 yasom 和 ycm。总结强调了按规范安装数据库的重要性以避免类似问题。
|
22天前
|
SQL 关系型数据库 MySQL
【YashanDB知识库】MySQL field 函数的改写方法
【YashanDB知识库】MySQL field 函数的改写方法
|
22天前
|
数据库
【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警
【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警
|
22天前
|
SQL Oracle 关系型数据库
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
【YashanDB知识库】共享利用Python脚本解决Oracle的SQL脚本@@用法
|
24天前
|
数据库
【YashanDB知识库】服务器重启后启动yasom和yasagent进程时有告警
本文介绍了YashanDB在特定场景下的问题分析与解决方法。当使用yasboot重启数据库后,yasom和yasagent进程虽启动成功但出现告警,原因是缺少libnsl.so.1库文件或环境变量配置错误。解决步骤包括:检查系统中是否存在该库文件,若不存在则根据操作系统类型安装(有外网时通过yum或apt,无外网时创建符号链接),若存在则调整环境变量配置,并重新启动相关进程验证问题是否解决。
|
24天前
|
存储 关系型数据库 MySQL
【YashanDB知识库】共享从 MySQL异常处理CONTINUE HANDLER的改写方法
本文介绍了MySQL中`CONTINUE HANDLER FOR NOT FOUND`的用法及其在YashanDB中的改写方法。通过一个示例存储过程,展示了如何使用游标和异常处理机制来应对“未找到数据”的情况。在MySQL中,`CONTINUE HANDLER`用于捕获此类异常;而在YashanDB中,则需改用游标的`%NOTFOUND`属性和`NO_DATA_FOUND`异常处理。文章对比了两者的执行效果,帮助用户顺利完成从MySQL到YashanDB的业务迁移。

热门文章

最新文章