c 查询oracle数据库

2023年 8月 4日 82.8k 0

在c语言的开发中,使用数据库是一个常见且关键的操作。Oracle数据库作为企业级数据库系统,应用广泛且稳定,如何通过C程序查询Oracle数据库是进行数据操作的一个重要环节。本篇文章将详细介绍如何使用C语言查询Oracle数据库。

连接Oracle数据库

在使用C语言查询Oracle数据库之前,需要先建立连接。一般情况下,使用ODBC或者OCI连接Oracle数据库会比较方便。以下是使用OCI连接数据库的示例代码:

OCIEnv *envhp; //环境句柄
OCIServer *srvhp; //服务器句柄
OCIError *errhp; //错误句柄
OCISession *usrhp; //用户句柄
OCISvcCtx *svchp; //服务句柄
OCIDefine *defhp; //查询结果定义句柄
OCIBind *bindp; //绑定变量句柄
OCIStmt *stmthp; //语句句柄
sword retcode; //Oracle函数返回值
char *username; //Oracle用户名
char *password; //Oracle用户密码
char *servername; //Oracle服务器名
//创建环境句柄
OCIEnvCreate(&envhp, OCI_OBJECT|OCI_THREADED, NULL, 0, NULL, NULL, 0, NULL);
//创建错误句柄
OCIHandleAlloc(envhp, (void **)&errhp, OCI_HTYPE_ERROR, 0, NULL);
//创建服务器句柄
OCIHandleAlloc(envhp, (void **)&srvhp, OCI_HTYPE_SERVER, 0, NULL);
//创建用户句柄
OCIHandleAlloc(envhp, (void **)&usrhp, OCI_HTYPE_SESSION, 0, NULL);
//创建服务句柄
OCIHandleAlloc(envhp, (void **)&svchp, OCI_HTYPE_SVCCTX, 0, NULL);
//连接数据库
OCIAttrSet(srvhp, OCI_HTYPE_SERVER, servername, strlen(servername), OCI_ATTR_SERVER, errhp);
OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, srvhp, 0, OCI_ATTR_SERVER, errhp);
OCIAttrSet(usrhp, OCI_HTYPE_SESSION, username, strlen(username), OCI_ATTR_USERNAME, errhp);
OCIAttrSet(usrhp, OCI_HTYPE_SESSION, password, strlen(password), OCI_ATTR_PASSWORD, errhp);
retcode = OCISessionBegin(svchp, errhp, usrhp, OCI_CRED_RDBMS, OCI_DEFAULT);
if (retcode) {
OCIHandleFree(svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
OCIHandleFree(errhp, OCI_HTYPE_ERROR);
return -1;
}
OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, usrhp, 0, OCI_ATTR_SESSION, errhp);

查询数据

连接好Oracle数据库之后,就可以使用C程序查询数据了。在使用OCI查询Oracle数据库时,需要先使用OCIHandleAlloc为查询结果定义句柄分配空间,然后使用OCIDefineByPos或者OCIDefineByNam将查询结果与句柄绑定。以下是一个使用OCI查询数据的示例:

char sql[512]; //SQL语句
int id; //查询结果变量
OCIDefine *defhp; //查询结果定义句柄
//创建语句句柄
OCIHandleAlloc(envhp, (void **)&stmthp, OCI_HTYPE_STMT, 0, NULL);
//准备SQL语句
sprintf(sql, "SELECT id FROM students WHERE name = 'Tom'");
//执行SQL语句
OCIStmtPrepare(stmthp, errhp, (OraText *)sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT);
//为查询结果变量定义句柄分配空间
OCIHandleAlloc(svchp, (void **)&defhp, OCI_HTYPE_DEFINE, 0, NULL);
//将查询结果变量与句柄绑定
OCIDefineByPos(stmthp, &defhp, errhp, 1, (void *)&id, sizeof(id), SQLT_INT, NULL, NULL, NULL, OCI_DEFAULT);
//从数据库中查询数据
OCIStmtExecute(svchp, stmthp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
//遍历查询结果
while (OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_NO_DATA) {
printf("Tom's id is %d\n", id);
}

断开连接

在使用完Oracle数据库之后,需要使用OCISessionEnd和OCIHandleFree断开连接并释放资源。以下是断开连接的示例:

//断开连接
OCISessionEnd(svchp, errhp, usrhp, OCI_DEFAULT);
//释放句柄资源
OCIHandleFree(svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree(usrhp, OCI_HTYPE_SESSION);
OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
OCIHandleFree(stmthp, OCI_HTYPE_STMT);
OCIHandleFree(envhp, OCI_HTYPE_ENV);

通过以上方法,我们可以在C程序中方便地查询Oracle数据库。需要注意的是,这只是使用OCI查询Oracle数据库的一个简单示例,实际操作中可能会有更多的细节要注意。

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论