远程访问Oracle数据库用C语言实现(c 远程访问oracle)

远程访问Oracle数据库——用C语言实现

随着互联网技术的迅猛发展,越来越多的应用需要访问远程数据库,而Oracle数据库是目前应用最广泛的关系型数据库之一。本文将介绍如何使用C语言实现远程访问Oracle数据库。

1. 准备工作

首先需要安装Oracle客户端软件,可以从Oracle官网下载。安装完成后,需要设置环境变量:

“`bash

export ORACLE_HOME=/usr/lib/oracle/11.2/client64

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib


其中,ORACLE_HOME是Oracle客户端软件的安装路径,LD_LIBRARY_PATH是动态库链接路径(若不设置,会报错“error while loading shared libraries: libclntsh.so.11.1”)。

2. 编写代码

我们使用oci(Oracle Call Interface)库来访问Oracle数据库。oci是Oracle提供的C语言接口库,可以使应用程序直接访问Oracle数据库。下面是一个示例代码:

```c
#include
#include
#include
int mn() {
OCIEnv *envhp; // 环境变量句柄
OCIError *errhp; // 错误句柄
OCISvcCtx *svchp; // 服务上下文句柄
OCISession *authp; // 会话句柄
OCIStmt *stmthp; // 语句句柄
int sts;
// 初始化OCI环境
OCIInitialize((ub4) OCI_DEFAULT, (dvoid *) 0,
(dvoid * (*)(dvoid *, size_t)) 0,
(dvoid * (*)(dvoid *, dvoid *, size_t)) 0,
(void (*)(dvoid *, dvoid *)) 0 );
// 创建OCI环境句柄
OCIEnvInit(&envhp, OCI_DEFAULT, 0, 0);
// 创建错误句柄
OCIHandleAlloc((dvoid *)envhp, (dvoid **)&errhp,
OCI_HTYPE_ERROR, (size_t)0, (dvoid**)0);
// 创建服务上下文句柄
OCIHandleAlloc((dvoid *)envhp, (dvoid **)&svchp,
OCI_HTYPE_SVCCTX, (size_t)0, (dvoid**)0);
// 连接数据库
sts = OCILogon(envhp, errhp, &svchp,
(OraText *)"username", strlen("username"),
(OraText *)"password", strlen("password"),
(OraText *)"database", strlen("database"));
if (sts != OCI_SUCCESS) {
OCIErrorGet((dvoid *)errhp, (ub4)1, (OraText *)0,
&sts, (OraText *)0, (ub4) 0, (ub4 *)0);
printf("OCILogon fled with error %d\n", sts);
exit(1);
}
// 分配会话句柄
OCIHandleAlloc((dvoid *)envhp, (dvoid **)&authp,
OCI_HTYPE_SESSION, (size_t)0, (dvoid**)0);
// 设置会话属性
OCIAttrSet((dvoid *)authp, (ub4)OCI_HTYPE_SESSION,
(dvoid *)"username", (ub4)strlen("username"),
OCI_ATTR_USERNAME, errhp);
OCIAttrSet((dvoid *)authp, (ub4)OCI_HTYPE_SESSION,
(dvoid *)"password", (ub4)strlen("password"),
OCI_ATTR_PASSWORD, errhp);
// 开始会话
sts = OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS,
OCI_DEFAULT);
if (sts != OCI_SUCCESS) {
OCIErrorGet((dvoid *)errhp, (ub4)1, (OraText *)0,
&sts, (OraText *)0, (ub4) 0, (ub4 *)0);
printf("OCISessionBegin fled with error %d\n", sts);
exit(1);
}
// 设置服务属性
OCIAttrSet((dvoid *)svchp, (ub4)OCI_HTYPE_SVCCTX,
(dvoid *)authp, (ub4)0, OCI_ATTR_SESSION, errhp);
// 分配语句句柄
OCIHandleAlloc((dvoid *)envhp, (dvoid **)&stmthp,
OCI_HTYPE_STMT, (size_t)0, (dvoid**)0);
// 执行查询语句
OCIStmtPrepare(stmthp, errhp, (OraText *) "SELECT * FROM table",
(ub4) strlen("SELECT * FROM table"),
OCI_NTV_SYNTAX, OCI_DEFAULT);
sts = OCIStmtExecute(svchp, stmthp, errhp, (ub4)1, (ub4)0,
(OCISnapshot *)0, (OCISnapshot *)0, OCI_DEFAULT);
if (sts != OCI_SUCCESS) {
OCIErrorGet((dvoid *)errhp, (ub4)1, (OraText *)0,
&sts, (OraText *)0, (ub4) 0, (ub4 *)0);
printf("OCIStmtExecute fled with error %d\n", sts);
exit(1);
}
// 获取结果集
OCIDefine *defnp;
int id, val;
OCIStmtFetch(stmthp, errhp, (ub4)1, OCI_FETCH_NEXT, OCI_DEFAULT);
OCIDefineByPos(stmthp, &defnp, errhp, 1,
(dvoid *)&id, sizeof(id), SQLT_INT, (dvoid *)0,
(ub2 *)0, (ub2 *)0, OCI_DEFAULT);
OCIDefineByPos(stmthp, &defnp, errhp, 2,
(dvoid *)&val, sizeof(val), SQLT_INT, (dvoid *)0,
(ub2 *)0, (ub2 *)0, OCI_DEFAULT);
printf("%d %d\n", id, val);
// 释放资源
OCIStmtRelease(stmthp, errhp, (OraText *)0, (ub4)0,
OCI_DEFAULT);
OCISessionEnd(svchp, errhp, authp, OCI_DEFAULT);
OCIHandleFree((dvoid *)authp, OCI_HTYPE_SESSION);
OCIHandleFree((dvoid *)svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree((dvoid *)envhp, OCI_HTYPE_ENV);
OCITerminate(OCI_DEFAULT);
return 0;
}

代码解释:

· OCIEnv、OCISvcCtx、OCISession、OCIStmt是oci中的四个重要的句柄。

· OCIInitialize:初始化OCI环境。

· OCIEnvInit:创建OCI环境句柄。

· OCIHandleAlloc:创建错误、服务上下文、会话和语句等句柄。

· OCILogon:连接数据库。

· OCIAttrSet:设置句柄属性。

· OCISessionBegin:开始会话。

· OCIStmtPrepare:准备SQL语句。

· OCIStmtExecute:执行查询。

· OCIDefineByPos:设置结果集。

· OCIStmtFetch:获取结果集。

· OCIStmtRelease、OCISessionEnd、OCIHandleFree:释放资源。

3. 编译运行

将以上代码保存为oracle.c,使用gcc编译链接:

“`bash

gcc -o oracle -I/usr/include/oracle/11.2/client64 -L/usr/lib/oracle/11.2/client64/lib -lclntsh oracle.c


其中,-I指定Oracle头文件路径,-L指定Oracle库路径,-lclntsh指定链接的库。编译成功后,就可以运行了:

```bash
./oracle

输出查询结果。

总结

以上就是使用C语言实现远程访问Oracle数据库的全部过程。需要注意的是,Oracle客户端软件的安装和配置是关键步骤,必须正确设置环境变量才能正常运行。此外,OCI接口使用稍微有些复杂,需要仔细研究文档。


数据运维技术 » 远程访问Oracle数据库用C语言实现(c 远程访问oracle)