首批通过分布式安全可靠测评,为关键业务系统打造
开发基本步骤
更新时间:2025-07-08 13:39:27
在一个应用程序中,我们是通过调用 OBCI 提供的库函数来实现对 OceanBase 数据库的操作。为了与 Oracle 兼容,OBCI 提供的函数均是以 OCI 开头并与 Oracle OCI 的函数同名。在存量的操作 Oracle 的应用程序中,开发人员可不用修改一行代码,用同样的函数接口来操作 OceanBase 数据库。
OBCI 基本结构
一个 OBCI 应用程序的基本结构包括:
初始化 OBCI 环境和线程。
分配必要的句柄与数据结构。
建立与数据库的连接以及创建用户会话。
通过 SQL 与 OceanBase 服务器交换数据,而后再做数据处理。
结束用户会话与断开与数据库的连接。
释放在程序中所分配的句柄。
OBCI 开发步骤
下图描述了在 OBCI 应用中开发的步骤流程,代码说明详情请参见 开发示例。

处理 SQL 语句
OBCI 程序最常见的任务之一即是接受并处理 SQL 语句,本段介绍 OBCI 应用程序在处理 SQL 语句时的细节。
一条 SQL 语句在 OBCI 应用程序中的执行步骤及过程中调用到的函数一般如下图所示:

通过调用函数 OCIStmtPrepare() 或者 OCIStmtPrepare2() 准备 SQL 语句。
在 SQL 语句中绑定需要输入到 SQL 语句中的变量 ,对于 DML 语句来说,由于它带有输入变量,我们可以通过调用一个或者多个函数,如 OCIBindByPos() 或 OCIBindByName() 等把输入变量的地址绑定在 DML 语句中的占位符中。
执行 SQL 语句。调用 OCIStmrExecute() 函数。对于 DDL 语句到这一步就完成了一个语句的执行。
描述 SQL 中输出的数据。
如有必要,可调用函数 OCIParamGet() 与 OCIAttGet( ) 来获取所读取的记录的字段个数、字段的数据类型以及字段数据定义的最大长度。
定义输出变量。
如有必要,调用 OCIDefineByPos() 函数为 SQL 语句中的数据输出项定义输出变量。
注意
请勿在 PL/SQL 匿名块中通过调用 OCIDefineByPos() 函数来定义输出变量,因在绑定数据后即已完成此步骤。
获取数据。
如有必要,为方便查询,可调用 OCIStmtFetch() 函数来获取查询的结果集。
应用示例
本次通过一个简单的 Linux 环境下的示例来说明 OBCI 的调用。
下述示例实现了对 person 表进行简单的增、删、插、改、查等基本操作。
在编译过程中需使用 OBCI 的头文件 oci.h,同时在链接阶段需使用 libobci.so 或 libobci.a 库文件。
注意
如为动态链接 libobci.so,同时需手动安装 OBClient RPM 包。如为静态链接 libobci.a,则无需额外安装 OBClient RPM 包。
示例语句:
静态链接:
gcc example.c -I/u01/obclient/include -I/usr/include/oracle/11.2/client64/ /u01/obclient/lib/libobci.a -L/usr/local/lib64 -lstdc++ -lpthread -ldl -lm -g -o example
动态链接:
gcc example.c -I/u01/obclient/include -I/usr/include/oracle/11.2/client64/ -L/u01/obclient/lib/ -L/usr/local/lib64 -lobci -lobclnt -g -o example
说明
默认推荐使用 oracle-11.2 client 的头文件,也可根据当前环境 include 目录路径自行进行调整。
执行输出:
export LD_LIBRARY_PATH=/u01/obclient/lib:$LD_LIBRARY_PATH
$./example
PERSONID NAME EMAIL
finish fetch data
finish insert tables
PERSONID NAME EMAIL
1 obtest t@ob.com
finish fetch data
PERSONID NAME EMAIL
1 test test@mail
finish fetch data
PERSONID NAME EMAIL
finish fetch data