成功运用C语言掌控Oracle原始数据库
Oracle是当今业界最为广泛使用的数据库之一,而C语言则是程序员们最熟悉的编程语言之一。让C语言可以掌控Oracle原始数据库,不仅可以提高软件开发效率,还可以加深对数据库基本原理的理解。下面将介绍如何成功运用C语言掌控Oracle原始数据库。
一、安装Oracle数据库
首先需要在自己电脑上搭建一个Oracle数据库,可以去Oracle官网下载安装包,按照提示进行安装即可。
二、连接Oracle数据库
连接Oracle数据库需要使用OCI(Oracle Call Interface),这是Oracle提供的一套C语言API库,可以方便地与Oracle数据库进行通信。
首先需要设置环境变量,在系统环境变量中添加OCI头文件和库文件的路径,如下图所示。
![image-1](https://cdn.ssp.com/article/64294a16-de98-0766-7e8f-1f62b9f84781.jpg?imageMogr2/quality/95/thumbnl/!1440x1440r/gravity/Center/crop/1440×1440)
然后就可以在代码中使用OCI进行连接了,示例如下:
#include
#include
int mn()
{
int status = 0;
OCIEnv* envhp;
OCIError* errhp;
OCIServer* srvhp;
OCISession* sesshp;
// 初始化 OCI 环境
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);
// 连接到数据库
OCILogon2(envhp, errhp, &srvhp, (OraText*)"system", strlen("system"), (OraText*)"password", strlen("password"), (OraText*)"orcl", strlen("orcl"), OCI_DEFAULT, OCI_DEFAULT);
// 创建会话句柄
OCIHandleAlloc(envhp, (void**)&sesshp, OCI_HTYPE_SESSION, 0, NULL);
// 设置会话模式
OCISessionBegin(srvhp, errhp, sesshp, OCI_CRED_RDBMS, OCI_DEFAULT);
// 进行操作
// ...
// 释放资源
OCIHandleFree(sesshp, OCI_HTYPE_SESSION);
OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
OCIHandleFree(errhp, OCI_HTYPE_ERROR);
OCIHandleFree(envhp, OCI_HTYPE_ENV);
return 0;
}
三、Oracle原始数据库操作
成功连接到Oracle数据库后,就可以使用OCI进行操作了,常见的操作有查询、插入、删除以及更新数据,具体示例如下:
查询数据:
OCIStmt* stmt;
OCIDefine* defnp;
int id = 1;
char name[20];
int age = 0;
// 分配语句句柄
OCIHandleAlloc(envhp, (void**)&stmt, OCI_HTYPE_STMT, 0, NULL);
// 绑定输入参数
OCIStmtPrepare(stmt, errhp, (OraText*)"SELECT * FROM person WHERE id=:1", strlen("SELECT * FROM person WHERE id=:1"), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIBindByPos(stmt, &defnp, errhp, 1, &id, sizeof(id), SQLT_INT, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
// 执行查询
OCIStmtExecute(srvhp, stmt, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
// 绑定输出参数
OCIDefineByPos(stmt, &defnp, errhp, 1, &name, sizeof(name), SQLT_STR, NULL, NULL, NULL, OCI_DEFAULT);
OCIDefineByPos(stmt, &defnp, errhp, 2, &age, sizeof(age), SQLT_INT, NULL, NULL, NULL, OCI_DEFAULT);
// 获取查询结果
while (OCIStmtFetch(stmt, errhp, 1, OCI_FETCH_NEXT, OCI_DEFAULT) != OCI_NO_DATA)
{
printf("id=%d, name=%s, age=%d\n", id, name, age);
}
// 释放资源
OCIHandleFree(stmt, OCI_HTYPE_STMT);
插入数据:
OCIStmt* stmt;
char name[] = "Tom";
int age = 21;
// 分配语句句柄
OCIHandleAlloc(envhp, (void**)&stmt, OCI_HTYPE_STMT, 0, NULL);
// 准备插入语句
OCIStmtPrepare(stmt, errhp, (OraText*)"INSERT INTO person(name, age) VALUES (:name, :age)", strlen("INSERT INTO person(name, age) VALUES (:name, :age)"), OCI_NTV_SYNTAX, OCI_DEFAULT);
// 绑定参数
OCIBindByName(stmt, &defnp, errhp, (OraText*)":name", strlen(":name"), &name, sizeof(name), SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
OCIBindByName(stmt, &defnp, errhp, (OraText*)":age", strlen(":age"), &age, sizeof(age), SQLT_INT, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
// 执行语句
OCIStmtExecute(srvhp, stmt, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
// 提交事务
OCITransCommit(srvhp, errhp, OCI_DEFAULT);
// 释放资源
OCIHandleFree(stmt, OCI_HTYPE_STMT);
删除数据:
OCIStmt* stmt;
int id = 1;
// 分配语句句柄
OCIHandleAlloc(envhp, (void**)&stmt, OCI_HTYPE_STMT, 0, NULL);
// 准备删除语句
OCIStmtPrepare(stmt, errhp, (OraText*)"DELETE FROM person WHERE id=:1", strlen("DELETE FROM person WHERE id=:1"), OCI_NTV_SYNTAX, OCI_DEFAULT);
// 绑定参数
OCIBindByPos(stmt, &defnp, errhp, 1, &id, sizeof(id), SQLT_INT, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
// 执行语句
OCIStmtExecute(srvhp, stmt, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
// 提交事务
OCITransCommit(srvhp, errhp, OCI_DEFAULT);
// 释放资源
OCIHandleFree(stmt, OCI_HTYPE_STMT);
更新数据:
OCIStmt* stmt;
int id = 1;
char name[] = "John";
int age = 22;
// 分配语句句柄
OCIHandleAlloc(envhp, (void**)&stmt, OCI_HTYPE_STMT, 0, NULL);
// 准备更新语句
OCIStmtPrepare(stmt, errhp, (OraText*)"UPDATE person SET name=:name, age=:age WHERE id=:id", strlen("UPDATE person SET name=:name, age=:age WHERE id=:id"), OCI_NTV_SYNTAX, OCI_DEFAULT);
// 绑定参数
OCIBindByPos(stmt, &defnp, errhp, 1, &name, sizeof(name), SQLT_STR, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
OCIBindByPos(stmt, &defnp, errhp, 2, &age, sizeof(age), SQLT_INT, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
OCIBindByPos(stmt, &defnp, errhp, 3, &id, sizeof(id), SQLT_INT, NULL, NULL, NULL, 0, NULL, OCI_DEFAULT);
// 执行语句
OCIStmtExecute(srvhp, stmt, errhp, 1, 0, NULL, NULL, OCI_DEFAULT);
// 提交事务
OCITransCommit(srvhp, errhp, OCI_DEFAULT);
// 释放资源
OCIHandleFree(stmt, OCI_HTYPE_STMT);
以上就是成功运用C语言掌控Oracle原始数据库的全部过程,希望对程序员们的数据库学习和应用有所帮助。