c oracle封装

2023年 8月 3日 42.3k 0

Oracle是一种被广泛使用的关系型数据库系统,而C语言则是一种被广泛应用于系统编程和嵌入式设备上的高级编程语言。为了方便使用Oracle数据库系统,在C语言开发中经常会出现用C语言与Oracle数据库进行直接交互的情况,为了更加方便使用,C语言中也出现了用来封装Oracle的库。

下面给出一个封装好的Oracle数据库库的例子:

#include#include#include#includetypedef struct
{
OCIEnv* p_env;
OCIError* p_err;
OCISvcCtx* p_svc;
OCIStmt* p_stmt;
OCIDefine* p_define;
OCIBind* p_bind;
OCIServer* p_server;
OCISession* p_session;
OCIParam* p_param;
ub4 n_nrows;
ub2 n_ncols;
} ConnInfo;
ConnInfo* OracleConnect(const char* sz_dbname, const char* sz_user, const char* sz_pwd)
{
ConnInfo* conn = NULL;
OCIEnv* env = NULL;
OCIError* err = NULL;
OCISvcCtx* svc = NULL;
OCIServer* server = NULL;
OCISession* session = NULL;
sword s_ret = OCI_SUCCESS;
const char* sz_db = "192.168.1.100:1521/orcl";
if (OCIEnvCreate(&env, OCI_THREADED|OCI_OBJECT, NULL, NULL, NULL, NULL, 0, NULL))
{
printf("OCIEnvCreate Error!\n");
return NULL;
}
if (OCIHandleAlloc(env, (void**)&err, OCI_HTYPE_ERROR, 0, NULL))
{
printf("OCIHandleAlloc OCI_HTYPE_ERROR Error!\n");
return NULL;
}
if (OCIHandleAlloc(env, (void**)&server, OCI_HTYPE_SERVER, 0, NULL))
{
printf("OCIHandleAlloc OCI_HTYPE_SERVER Error!\n");
return NULL;
}
s_ret = OCIServerAttach(server, err, (OraText*)sz_dbname, strlen(sz_dbname), 0);
if (s_ret != OCI_SUCCESS)
{
if (s_ret == OCI_INVALID_HANDLE)
{
printf("OCIServerAttach OCI_INVALID_HANDLE Error!\n");
}
else if (s_ret == OCI_SUCCESS_WITH_INFO)
{
printf("OCIServerAttach OCI_SUCCESS_WITH_INFO Error!\n");
}
else
{
printf("OCIServerAttach Error!\n");
}
return NULL;
}
if (OCIHandleAlloc(env, (void**)&session, OCI_HTYPE_SESSION, 0, NULL))
{
printf("OCIHandleAlloc OCI_HTYPE_SESSION Error!\n");
return NULL;
}
if (OCIAttrSet(session, OCI_HTYPE_SESSION, (void*)sz_user, strlen(sz_user), OCI_ATTR_USERNAME, err))
{
printf("OCIAttrSet OCI_ATTR_USERNAME Error!\n");
return NULL;
}
if (OCIAttrSet(session, OCI_HTYPE_SESSION, (void*)sz_pwd, strlen(sz_pwd), OCI_ATTR_PASSWORD, err))
{
printf("OCIAttrSet OCI_ATTR_PASSWORD Error!\n");
return NULL;
}
s_ret = OCISessionBegin(svc, err, session, OCI_CRED_RDBMS, OCI_DEFAULT);
if (s_ret != OCI_SUCCESS)
{
if (s_ret == OCI_INVALID_HANDLE)
{
printf("OCISessionBegin OCI_INVALID_HANDLE Error!\n");
}
else if (s_ret == OCI_SUCCESS_WITH_INFO)
{
printf("OCISessionBegin OCI_SUCCESS_WITH_INFO Error!\n");
}
else
{
printf("OCISessionBegin Error!\n");
}
return NULL;
}
if (OCIHandleAlloc(env, (void**)&svc, OCI_HTYPE_SVCCTX, 0, NULL))
{
printf("OCIHandleAlloc OCI_HTYPE_SVCCTX Error!\n");
return NULL;
}
if (OCIAttrSet(svc, OCI_HTYPE_SVCCTX, (void*)server, sizeof(server), OCI_ATTR_SERVER, err))
{
printf("OCIAttrSet OCI_ATTR_SERVER Error!\n");
return NULL;
}
if (OCIAttrSet(svc, OCI_HTYPE_SVCCTX, (void*)session, sizeof(session), OCI_ATTR_SESSION, err))
{
printf("OCIAttrSet OCI_ATTR_SESSION Error!\n");
return NULL;
}
conn = (ConnInfo*)malloc(sizeof(ConnInfo));
memset(conn, 0, sizeof(ConnInfo));
conn->p_env = env;
conn->p_err = err;
conn->p_svc = svc;
conn->p_server = server;
conn->p_session = session;
return conn;
}
void OracleDisconnect(ConnInfo* conn)
{
if (conn)
{
OCIHandleFree((void*)conn->p_err, OCI_HTYPE_ERROR);
OCIHandleFree((void*)conn->p_server, OCI_HTYPE_SERVER);
OCIHandleFree((void*)conn->p_session, OCI_HTYPE_SESSION);
OCIHandleFree((void*)conn->p_svc, OCI_HTYPE_SVCCTX);
OCIHandleFree((void*)conn->p_stmt, OCI_HTYPE_STMT);
OCIHandleFree((void*)conn->p_define, OCI_HTYPE_DEFINE);
OCIHandleFree((void*)conn->p_bind, OCI_HTYPE_BIND);
OCIHandleFree((void*)conn->p_param, OCI_HTYPE_PARAM);
OCIHandleFree((void*)conn->p_env, OCI_HTYPE_ENV);
free(conn);
conn = NULL;
}
}

该库主要由OracleConnect函数和OracleDisconnect函数组成,前者用于连接Oracle数据库,后者用于断开连接。通过调用这两个函数,我们就可以在C语言中直接实现与Oracle数据库的交互。

不仅如此,我们还可以通过这个封装出来的库来实现诸如数据增删改查、存储过程等操作,从而更加方便地操作Oracle数据库系统。例如下面是一个C语言连接Oracle数据库后查询一个表格数据的例子:

OracleConnect("orcl", "scott", "tiger");
OCIStmt* p_sqlstatement;
OCIStmtPrepare(p_sqlstatement, conn->p_err, (CONST OraText*)"SELECT * FROM emp;", strlen("SELECT * FROM emp;"), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIStmtExecute(conn->p_svc, p_sqlstatement, conn->p_err, 1, 0, NULL, NULL, OCI_DEFAULT);
OCIStmtFetch(p_sqlstatement, conn->p_err, conn->n_nrows, OCI_FETCH_NEXT, OCI_DEFAULT);

在这个例子中,我们先是通过OracleConnect函数获取到一个数据库连接,然后定义了一个SQL语句,语句中查询了表格emp中的所有数据。接着使用OCIStmtPrepare函数将这些语句封装到一个C语言类型中,然后再使用OCIStmtExecute函数将其传递给Oracle数据库进行执行。

最后通过OCIStmtFetch函数把查询结果存储到C语言中。这个例子充分说明了C语言与Oracle数据库之间的交互可以通过封装一个库来实现。

综上所述,C语言与Oracle数据库之间的交互可以通过封装一个库来实现,在C语言中,我们可以直接使用这个库中的函数来完成数据增删改查、存储过程等功能,从而更加方便地操作Oracle数据库系统。

相关文章

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

发布评论