c 连本地oracle

2023年 8月 4日 31.4k 0

Oracle是一种常用的关系型数据库,而C语言可以作为一种通用的编程语言来操作Oracle数据库。在使用C语言连接Oracle数据库时,需要使用Oracle提供的OCI接口,而且需要在本地安装好Oracle客户端和SDK等必要的工具,才能运行使用。

连接Oracle数据库首先需要了解Oracle的客户端与服务端的连接方式,常用的连接方式有OCI连接、ODBC连接以及JDBC连接等。本文主要讲解使用OCI连接来连接本地Oracle数据库。

在使用OCI连接Oracle数据库之前,需要进行一些必要的设置。首先需要设置环境变量,将Oracle的头文件路径和库文件路径加入到PATH和LD_LIBRARY_PATH中。通常可以通过设置LD_LIBRARY_PATH环境变量来指定Oracle的库文件路径,例如:

export LD_LIBRARY_PATH=$ORACLE_HOME/lib:$LD_LIBRARY_PATH

接下来需要在代码中包含Oracle的头文件,并链接Oracle的库文件,通常需要链接libclntsh.so和libnnz11.so等库文件。以此方式编写的C连接Oracle的代码如下:

#include
#include
#include
#include
int main()
{
OCIEnv* env;
OCIError* err;
OCISession* session;
OCIServer* server;
OCISvcCtx* svc;
sword status;
if (OCIEnvCreate(&env, OCI_DEFAULT, NULL, NULL, NULL, NULL, 0, NULL) != OCI_SUCCESS)
{
return -1;
}
if (OCIHandleAlloc(env, (dvoid**) &err, OCI_HTYPE_ERROR, 0, NULL) != OCI_SUCCESS)
{
return -1;
}
if (OCIHandleAlloc(env, (dvoid**) &server, OCI_HTYPE_SERVER, 0, NULL) != OCI_SUCCESS)
{
return -1;
}
if (OCIHandleAlloc(env, (dvoid**) &session, OCI_HTYPE_SESSION, 0, NULL) != OCI_SUCCESS)
{
return -1;
}
if (OCIHandleAlloc(env, (dvoid**) &svc, OCI_HTYPE_SVCCTX, 0, NULL) != OCI_SUCCESS)
{
return -1;
}
CHECK_ERROR(OCIAttrSet((dvoid*) server, OCI_HTYPE_SERVER, (dvoid*) server_name, strlen(server_name)+1,OCI_ATTR_SERVER_HOST, err));
CHECK_ERROR(OCIAttrSet((dvoid*) server, OCI_HTYPE_SERVER, (dvoid*) &port_no, sizeof(port_no),OCI_ATTR_SERVER_PORT, err));
// Connect
CHECK_ERROR(OCIServerAttach(server, err, (text*) db_name, strlen(db_name), 0));
CHECK_ERROR(OCIAttrSet((dvoid*) session, OCI_HTYPE_SESSION, (dvoid*) user_id, strlen(user_id),OCI_ATTR_USERNAME, err));
CHECK_ERROR(OCIAttrSet((dvoid*) session, OCI_HTYPE_SESSION, (dvoid*) passwd, strlen(passwd),OCI_ATTR_PASSWORD, err));
status = OCISessionBegin(svc, err, session, OCI_CRED_RDBMS, OCI_DEFAULT);
if (status != OCI_SUCCESS)
{
return -1;
}
OCIStmt* stmt;
if (OCIHandleAlloc(env, (dvoid**) &stmt, OCI_HTYPE_STMT, 0, NULL) != OCI_SUCCESS)
{
return -1;
}
// Prepare
CHECK_ERROR(OCIStmtPrepare(stmt, err, (text*) sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT));
// Execute
status = OCIStmtExecute(svc, stmt, err, 1, 0, NULL, NULL, OCI_DEFAULT);
if (status != OCI_SUCCESS && status != OCI_NO_DATA)
{
printf("OCIStmtExecute error: %d\n", status);
return -1;
}
// Fetch
status = OCIStmtFetch(stmt, err, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
while (status == OCI_SUCCESS)
{
// process data
status = OCIStmtFetch(stmt, err, 1, OCI_FETCH_NEXT, OCI_DEFAULT);
}
CHECK_ERROR(OCISessionEnd(svc, err, session, OCI_DEFAULT));
CHECK_ERROR(OCIServerDetach(server, err, OCI_DEFAULT));
CHECK_ERROR(OCIHandleFree(err, OCI_HTYPE_ERROR));
CHECK_ERROR(OCIHandleFree(svc, OCI_HTYPE_SVCCTX));
CHECK_ERROR(OCIHandleFree(session, OCI_HTYPE_SESSION));
CHECK_ERROR(OCIHandleFree(server, OCI_HTYPE_SERVER));
OCIHandleFree((dvoid*) env, OCI_HTYPE_ENV);
return 0;
}

上述代码中,首先需要通过OCI接口实现环境变量和句柄的初始化。之后需要根据Oracle数据库的主机地址、端口号、用户名和密码等进行连接数据库操作。然后可以通过OCIStmtPrepare函数来实现SQL语句的预编译,而OCIStmtExecute函数和OCIStmtFetch函数则可以分别实现SQL语句的执行和结果数据的获取。

通过以上C语言连接Oracle数据库的方式,可以很方便地实现C程序访问Oracle数据库的功能。但是在使用时需要注意头文件的引用和库文件的链接等问题,以确保程序的正确编译和运行。

相关文章

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

发布评论