开发数据库应用Oracle C API简明教程(oracle c api)
开发数据库应用:Oracle C API简明教程
Oracle数据库是企业级应用最常用的数据库之一。如果你想通过C语言进行与Oracle数据库的交互,Oracle提供了多种API,其中C API是最基本的API之一。本文将介绍Oracle C API的基本用法和示例代码。
1. 准备工作
你需要安装Oracle客户端和开发工具包。Oracle的官方网站上提供了各种版本的Oracle客户端和开发工具包下载。安装完毕后,你需要在系统环境变量中添加Oracle客户端库的路径(比如:D:\Oracle\instantclient_19_3)。
也可以在程序中使用以下代码设置客户端库的路径:
“`c
putenv(“PATH=D:\Oracle\instantclient_19_3”);
2. 连接数据库
我们需要使用OCI API(Oracle Call Interface)来连接到Oracle数据库。以下是一个连接到数据库的例子:
```c#include
#include
#include
void checkerr(OCIError *errhp, sword status);
int mn(void) { OCIEnv *envhp;
OCIError *errhp; OCIServer *srvhp;
OCISession *authp; sword status;
// 初始化环境句柄
OCIEnvCreate(&envhp, OCI_THREADED, NULL, NULL, NULL, NULL, 0, NULL);
// 分配错误句柄 OCIHandleAlloc(envhp, (void **)&errhp, OCI_HTYPE_ERROR, 0, NULL);
// 分配服务器句柄 OCIHandleAlloc(envhp, (void **)&srvhp, OCI_HTYPE_SERVER, 0, NULL);
// 创建服务器连接字符串 OCIServerAttach(srvhp, errhp, "ORCL", strlen("ORCL"), OCI_DEFAULT);
// 分配会话句柄 OCIHandleAlloc(envhp, (void **)&authp, OCI_HTYPE_SESSION, 0, NULL);
// 设置会话属性 OCISessionBegin(envhp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT);
// 设置身份属性 status = OCIAttrSet(authp, OCI_HTYPE_SESSION, "username", strlen("username"), OCI_ATTR_USERNAME, errhp);
checkerr(errhp, status);
status = OCIAttrSet(authp, OCI_HTYPE_SESSION, "password", strlen("password"), OCI_ATTR_PASSWORD, errhp); checkerr(errhp, status);
// 建立连接 OCIAttrSet(srvhp, OCI_HTYPE_SERVER, authp, 0, OCI_ATTR_SESSION, errhp);
checkerr(errhp, status);
// 释放资源 OCIHandleFree(authp, OCI_HTYPE_SESSION);
OCIHandleFree(srvhp, OCI_HTYPE_SERVER); OCIHandleFree(errhp, OCI_HTYPE_ERROR);
OCITerminate(OCI_DEFAULT); return 0;
}
// 错误处理函数void checkerr(OCIError *errhp, sword status) {
text errbuf[512]; sb4 errcode;
OCIErrorGet(errhp, 1, NULL, &errcode, errbuf, sizeof(errbuf), OCI_HTYPE_ERROR); if (status != OCI_SUCCESS) {
printf("Error: %s\n", errbuf); exit(1);
}}
在上面的示例中,我们分配了环境句柄、错误句柄、服务器句柄和会话句柄。通过OCIAttrSet函数设置会话属性和身份属性。我们使用OCIServerAttach函数连接到数据库,然后使用OCIAttrSet函数建立连接。在连接建立后,我们释放所有已分配的句柄。
3. 查询数据
下面的示例演示了如何执行简单的SELECT查询,然后输出查询结果。
“`c
#include
#include
#include
void checkerr(OCIError *errhp, sword status);
int mn(void) {
OCIEnv *envhp;
OCIError *errhp;
OCIServer *srvhp;
OCISession *authp;
OCIStmt *stmthp;
OCIDefine *defnp;
sword status;
// 初始化环境句柄
OCIEnvCreate(&envhp, OCI_THREADED, NULL, NULL, NULL, NULL, 0, NULL);
// 分配错误句柄
OCIHandleAlloc(envhp, (void **)&errhp, OCI_HTYPE_ERROR, 0, NULL);
// 分配服务器句柄
OCIHandleAlloc(envhp, (void **)&srvhp, OCI_HTYPE_SERVER, 0, NULL);
// 创建服务器连接字符串
OCIServerAttach(srvhp, errhp, “ORCL”, strlen(“ORCL”), OCI_DEFAULT);
// 分配会话句柄
OCIHandleAlloc(envhp, (void **)&authp, OCI_HTYPE_SESSION, 0, NULL);
// 设置会话属性
OCISessionBegin(envhp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT);
// 设置身份属性
status = OCIAttrSet(authp, OCI_HTYPE_SESSION, “username”, strlen(“username”), OCI_ATTR_USERNAME, errhp);
checkerr(errhp, status);
status = OCIAttrSet(authp, OCI_HTYPE_SESSION, “password”, strlen(“password”), OCI_ATTR_PASSWORD, errhp);
checkerr(errhp, status);
// 建立连接
OCIAttrSet(srvhp, OCI_HTYPE_SERVER, authp, 0, OCI_ATTR_SESSION, errhp);
checkerr(errhp, status);
// 创建语句句柄
OCIHandleAlloc(envhp, (void **)&stmthp, OCI_HTYPE_STMT, 0, NULL);
// 准备查询语句
OCIStmtPrepare(stmthp, errhp, “SELECT * FROM table_name WHERE column_name = :1”, strlen(“SELECT * FROM table_name WHERE column_name = :1”), OCI_NTV_SYNTAX, OCI_DEFAULT);
// 绑定输入变量
OCIBindByPos(stmthp, (OCIBind **)&defnp, errhp, 1, NULL, 0, SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
// 设置输入变量的值
char value[32] = “some_value”;
OCIBindArrayOfStruct(defnp, errhp, 1, sizeof(value), 0, NULL);
OCIBindArrayOfStructSet(defnp, errhp, 1, value, sizeof(value), 0, NULL);
// 执行查询语句
OCIStmtExecute(srvhp, stmthp, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
// 绑定输出变量
OCIDefineByPos(stmthp, &defnp, errhp, 1, NULL, 0, SQLT_STR, NULL, NULL, NULL, OCI_DEFAULT);
// 输出查询结果
char result[32];
while ((status = OCIStmtFetch(stmthp, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT)) == OCI_SUCCESS) {
OCIDefineArrayOfStruct(defnp, errhp, 1, sizeof(result), 0, NULL);
OCIDefineArrayOfStructGet(defnp, errhp, 1, result, sizeof(result), 0, NULL);
printf(“Result: %s\n”, result);
}
// 释放句柄
OCIStmtRelease(stmthp, errhp, NULL, 0, OCI_DEFAULT);
OCIHandleFree(authp, OCI_HTYPE_SESSION);
OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
OCIHandleFree(errhp, OCI_HTYPE_ERROR);
OCITerminate(OCI_DEFAULT);
return 0;
}
// 错误处理函数
void checkerr(OCIError *errhp, sword status) {
text errbuf[512];
sb4 errcode;
OCIErrorGet(errhp, 1, NULL, &errcode, errbuf, sizeof(errbuf), OCI_HTYPE_ERROR);
if (status != OCI_SUCCESS) {
printf(“Error: %s\n”, errbuf);
exit(1);
}
}
在上面的示例中,我们执行SELECT查询并向输入变量绑定值。然后,我们通过OCIStmtExecute函数执行查询语句。绑定输出变量,然后通过OCIStmtFetch函数获取查询结果。在处理完所有结果后,我们释放所有已分配的句柄。
4. 总结
这篇教程介绍了一些基本的Oracle C API的用法,包括连接到Oracle数据库、执行SELECT查询等。当然,Oracle C API还具有更丰富的功能,