C和Oracle是两个非常重要的编程和数据库技术,分别在不同的领域中发挥着至关重要的作用。C语言是一门很古老的编程语言,它已经陪伴着计算机发展了很长时间,而Oracle则是一种广泛使用的关系型数据库管理系统。当两个技术组合在一起时,会给我们带来很多有趣的例子和应用场景。
C语言可以很好地与Oracle集成,实现数据在Oracle数据库和C程序之间的交互。下面我们来看一个简单的例子。
#include
#include
#include
int main (int argc, char const *argv[]) {
OCIEnv *envhp;
OCIError *errhp;
OCIServer *srvhp;
OCISvcCtx *svchp;
OCISession *authp;
OCIStmt *stmthp;
sword status;
char username[20], password[20], query[100], name[20], grade[5];
int id;
OCIDefine *defhp1, *defhp2, *defhp3;
// 创建环境句柄
status = OCIEnvCreate(&envhp, OCI_THREADED | OCI_OBJECT, 0, 0, 0, 0, 0, 0);
if (status != OCI_SUCCESS) {
printf("OCIEnvCreate failed\n");
return 1;
}
// 创建错误句柄
OCIHandleAlloc(envhp, (void**)&errhp, OCI_HTYPE_ERROR, 0, 0);
// 创建服务器句柄
OCIHandleAlloc(envhp, (void**)&srvhp, OCI_HTYPE_SERVER, 0, 0);
// 创建服务上下文句柄
OCIHandleAlloc(envhp, (void**)&svchp, OCI_HTYPE_SVCCTX, 0, 0);
// 连接数据库
strcpy(username, "username");
strcpy(password, "password");
OCIServerAttach(srvhp, errhp, (text*)"ORCL", strlen("ORCL"), OCI_DEFAULT);
OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, srvhp, 0, OCI_ATTR_SERVER, errhp);
OCIHandleAlloc(envhp, (void**)&authp, OCI_HTYPE_SESSION, 0, 0);
OCIAttrSet(authp, OCI_HTYPE_SESSION, username, strlen(username), OCI_ATTR_USERNAME, errhp);
OCIAttrSet(authp, OCI_HTYPE_SESSION, password, strlen(password), OCI_ATTR_PASSWORD, errhp);
status = OCISessionBegin(svchp, errhp, authp, OCI_CRED_RDBMS, OCI_DEFAULT);
OCIAttrSet(svchp, OCI_HTYPE_SVCCTX, authp, 0, OCI_ATTR_SESSION, errhp);
// 执行查询语句
id = 3;
sprintf(query, "SELECT name, grade FROM students WHERE id = %d", id);
OCIHandleAlloc(envhp, (void**)&stmthp, OCI_HTYPE_STMT, 0, 0);
OCIStmtPrepare(stmthp, errhp, query, strlen(query), OCI_NTV_SYNTAX, OCI_DEFAULT);
OCIHandleAlloc(envhp, (void**)&defhp1, OCI_HTYPE_DEFINE, 0, 0);
OCIHandleAlloc(envhp, (void**)&defhp2, OCI_HTYPE_DEFINE, 0, 0);
OCIHandleAlloc(envhp, (void**)&defhp3, OCI_HTYPE_DEFINE, 0, 0);
OCIDefineByPos(stmthp, &defhp1, errhp, 1, name, sizeof(name), SQLT_STR, 0, 0, 0, OCI_DEFAULT);
OCIDefineByPos(stmthp, &defhp2, errhp, 2, grade, sizeof(grade), SQLT_STR, 0, 0, 0, OCI_DEFAULT);
OCIStmtExecute(svchp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT);
// 处理结果
printf("Student Information:\n");
printf("Name: %s\n", name);
printf("Grade: %s\n", grade);
// 断开连接
status = OCISessionEnd(svchp, errhp, authp, OCI_DEFAULT);
OCIServerDetach(srvhp, errhp, OCI_DEFAULT);
OCIHandleFree(authp, OCI_HTYPE_SESSION);
OCIHandleFree(srvhp, OCI_HTYPE_SERVER);
OCIHandleFree(svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree(stmthp, OCI_HTYPE_STMT);
OCIHandleFree(errhp, OCI_HTYPE_ERROR);
OCIHandleFree(envhp, OCI_HTYPE_ENV);
return 0;
}
上面的代码演示了如何连接Oracle数据库,在其中执行一个查询并处理结果。我们通过OCI连接进行数据库访问,并通过OCIStmtPrepare函数准备一个SQL语句。该函数也承担了语法分析和数据预处理的角色,包括绑定变量。然后,我们使用OCIDefineByPos()函数将其作为位置指定到SELECT语句的结果列,并通过OCIStmtExecute()函数执行语句。
当语句执行成功时,我们将结果存储在C程序变量中,并在终端打印输出。此后,我们通过OCIHandleFree()函数断开与Oracle数据库的连接并释放程序资源。
结论:
C和Oracle在实际中有很多应用场景。尽管C语言不像Python和Java那样流行,但它仍然在学术界和工业应用中得到了广泛的应用,而Oracle则是目前最通用的关系型数据库之一。