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

devtools/2024/10/20 21:33:57/

本文内容来自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工具

yashandbOCI_39">如何编译yashandb的OCI代码?

接下来,以官网OCI示例代码为例,快速上手编译Yashandb的OCI代码

准备编译前命令

编辑 CMakeList.txt,它是CMAKE工程编译的声明命令文件

点击查看代码
[yashan103@localhost oci_dir]$ cat CMakeLists.txtcmake_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.txtcmake_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]$ lltotal 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_READMEdrwxrwxr-x. 2 yashan103 yashan103 55 Apr 1 10:46 bin-rwxr-xr-x. 1 yashan103 yashan103 59544 Dec 21 2023 genezidrwxrwxr-x. 2 yashan103 yashan103 6 Aug 5 21:38 includedrwxrwxr-x. 2 yashan103 yashan103 6 Aug 5 21:38 liblrwxrwxrwx. 1 yashan103 yashan103 21 Jul 23 11:22 libclntshcore.so -> libclntshcore.so.21.1lrwxrwxrwx. 1 yashan103 yashan103 21 Jul 23 11:22 libclntshcore.so.12.1 -> libclntshcore.so.21.1lrwxrwxrwx. 1 yashan103 yashan103 21 Jul 23 11:22 libclntshcore.so.18.1 -> libclntshcore.so.21.1lrwxrwxrwx. 1 yashan103 yashan103 21 Jul 23 11:22 libclntshcore.so.19.1 -> libclntshcore.so.21.1lrwxrwxrwx. 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.1lrwxrwxrwx. 1 yashan103 yashan103 17 Jul 23 11:22 libclntsh.so -> libclntsh.so.21.1lrwxrwxrwx. 1 yashan103 yashan103 17 Jul 23 11:22 libclntsh.so.10.1 -> libclntsh.so.21.1lrwxrwxrwx. 1 yashan103 yashan103 17 Jul 23 11:22 libclntsh.so.11.1 -> libclntsh.so.21.1lrwxrwxrwx. 1 yashan103 yashan103 17 Jul 23 11:22 libclntsh.so.12.1 -> libclntsh.so.21.1lrwxrwxrwx. 1 yashan103 yashan103 17 Jul 23 11:22 libclntsh.so.18.1 -> libclntsh.so.21.1lrwxrwxrwx. 1 yashan103 yashan103 17 Jul 23 11:22 libclntsh.so.19.1 -> libclntsh.so.21.1lrwxrwxrwx. 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.1lrwxrwxrwx. 1 yashan103 yashan103 14 Apr 1 10:46 libcsvexp.so -> libcsvexp.so.0lrwxrwxrwx. 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.100lrwxrwxrwx. 1 yashan103 yashan103 15 Apr 1 10:46 liblz4.so -> liblz4.so.1.9.3lrwxrwxrwx. 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.solrwxrwxrwx. 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.1lrwxrwxrwx. 1 yashan103 yashan103 15 Jul 23 11:22 libocci.so -> libocci.so.21.1lrwxrwxrwx. 1 yashan103 yashan103 15 Jul 23 11:22 libocci.so.10.1 -> libocci.so.21.1lrwxrwxrwx. 1 yashan103 yashan103 15 Jul 23 11:22 libocci.so.11.1 -> libocci.so.21.1lrwxrwxrwx. 1 yashan103 yashan103 15 Jul 23 11:22 libocci.so.12.1 -> libocci.so.21.1lrwxrwxrwx. 1 yashan103 yashan103 15 Jul 23 11:22 libocci.so.18.1 -> libocci.so.21.1lrwxrwxrwx. 1 yashan103 yashan103 15 Jul 23 11:22 libocci.so.19.1 -> libocci.so.21.1lrwxrwxrwx. 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.alrwxrwxrwx. 1 yashan103 yashan103 20 Apr 1 10:46 libpcre2-8.so -> libpcre2-8.so.0.10.4lrwxrwxrwx. 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.4lrwxrwxrwx. 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.1lrwxrwxrwx. 1 yashan103 yashan103 14 Apr 1 10:46 libyascli.so -> libyascli.so.0lrwxrwxrwx. 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.100lrwxrwxrwx. 1 yashan103 yashan103 17 Apr 1 10:46 libyas_infra.so -> libyas_infra.so.0lrwxrwxrwx. 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.solrwxrwxrwx. 1 yashan103 yashan103 16 Apr 1 10:46 libzstd.so -> libzstd.so.1.5.2lrwxrwxrwx. 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.2drwxr-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.jardrwxr-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]$ lltotal 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]$ lltotal 32-rw-rw-r--. 1 yashan103 yashan103 4534 Aug 5 23:03 bb.cdrwxrwxr-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]$ makeScanning 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_TESTtest 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


http://www.ppmy.cn/devtools/120204.html

相关文章

TinyVue:一款轻量级且功能强大的Vue UI组件库

在前端开发的广阔领域中&#xff0c;Vue.js以其易用性、灵活性和高效性赢得了广泛的认可。而TinyVue&#xff0c;作为Vue生态中的一个新兴力量&#xff0c;以其独特的优势吸引了众多开发者的目光。本文将深入解析TinyVue&#xff0c;从基本概念、特性、应用场景到使用方式&…

将图片资源保存到服务器的盘符中

服务类 系统盘符&#xff1a;file-path.disk&#xff08;可能会变&#xff0c;配置配置文件dev中&#xff09;文件根路径&#xff1a;file-path.root-path&#xff08;可能会变&#xff0c;配置配置文件dev中&#xff09;http协议的Nginx的映射前缀&#xff1a;PrefixConstant.…

leetcode:字符串相加

题目链接 给定两个字符串形式的非负整数 num1 和num2 &#xff0c;计算它们的和并同样以字符串形式返回。 你不能使用任何內建的用于处理大整数的库&#xff08;比如 BigInteger&#xff09;&#xff0c; 也不能直接将输入的字符串转换为整数形式。 示例 1&#xff1a; 输入&…

12.C++程序中的自定义函数

11.C程序中的常用函数-CSDN博客https://blog.csdn.net/fly_binbin/article/details/142643406上面说的是C程序中内置的一些函数&#xff0c;这些函数是由编译器提供的&#xff0c;可以方便大家的使用&#xff0c;但是很多时候&#xff0c;单纯的内置函数无法满足人们的需求&…

报错 libgomp.so.1, needed by vendor/llama.cpp/ggml/src/libggml.so, not found

在安装 xinference时报错 安装命令 pip install "xinference[all]" 报错内容 ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 1.2/1.2 MB 3.7 MB/s eta 0:00:00 INFO: pip is looking at multiple versions of multiprocess t…

golang学习笔记26-管道(Channel)【重要】

本节也是GO核心部分&#xff0c;很重要。 注意&#xff1a;Channel更准确的翻译应该是通道&#xff0c;管道实际上叫Pipeline。当然&#xff0c;在GO中&#xff0c;管道专指Channel。 管道本质上是一个队列&#xff0c;队列是数据结构的内容&#xff0c;这里不做赘述。管道对协…

OpenGL ES简述(1)

OpenGL ES简述(1) 简述 这个章节我们会来介绍一下OpenGL ES&#xff0c;学习OpenGL ES主要是为了了解GPU为我们提供了怎样的能力&#xff0c;Android系统中使用的是OpenGL ES&#xff0c;但是核心是一样的&#xff0c;了解OpenGL ES后我们可以对Android渲染有更深的理解。 An…

SpringBoot 请求和响应

1. Spring Boot 请求与响应概述 在 Spring Boot 开发中&#xff0c;客户端通过浏览器发起请求&#xff0c;后端使用内置的 Tomcat Web 服务器处理请求&#xff0c;返回响应数据。请求和响应的过程遵循 HTTP 协议。Spring Boot 的核心 Servlet 程序是 DispatcherServlet&#x…