c 读写oracle

在现代编程中,与数据库的交互是不可或缺的一部分。Oracle数据库是广泛使用的企业级关系型数据库管理系统,据统计约有70%以上的中大型企业都在使用它。而C作为一种高效、面向过程的编程语言,也是数十年来一直被广泛运用。那么,如何利用C语言来与Oracle数据库进行读写呢?

首先,我们需要安装合适的Oracle驱动程序,比如OCI(Oracle Call Interface)。OCI是一种C编程接口,能够很好地操作Oracle数据库。在这里我以OCI为例,讲解C如何使用OCI来读写Oracle数据库。

// user.c #include#include#includeint main(void) { OCIEnv *envhp; OCIError *errhp; OCISvcCtx *svchp; OCISession *authp; OCIDefine *defhp; OCIStmt *stmthp; sword status = 0; text *username = "scott"; text *password = "tiger"; text *db = "localhost:1521/orcl"; text *sql = "SELECT * FROM emp"; /* 初始化环境变量 */ OCIInitialize(OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t))0, (void (*)(dvoid *, dvoid *)) 0 ); /* 分配环境变量 */ OCIEnvCreate(&envhp, OCI_THREADED|OCI_OBJECT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t)) 0, (dvoid * (*)(dvoid *, dvoid *, size_t)) 0, (void (*)(dvoid *, dvoid *)) 0, (size_t) 0, (dvoid **)0); /*从环境变量中的到错误变量*/ OCIHandleAlloc((dvoid *) envhp, (dvoid **) &errhp, OCI_HTYPE_ERROR, (size_t) 0, (dvoid **) 0); /*从环境变量中的到服务器上下文*/ OCIHandleAlloc((dvoid *) envhp, (dvoid **) &svchp, OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid **) 0); /*从环境变量中的到会话上下文*/ OCIHandleAlloc((dvoid *) envhp, (dvoid **) &authp, OCI_HTYPE_SESSION, (size_t) 0, (dvoid **) 0); /*从会话上下文内得出语句句柄*/ OCIHandleAlloc((dvoid *) envhp, (dvoid **) &stmthp, OCI_HTYPE_STMT, (size_t) 0, (dvoid **) 0); /* 连接数据库 */ status = OCILogon(envhp, errhp, &svchp, username, (ub4)strlen(username), password, (ub4)strlen(password), db, (ub4)strlen(db)); if (status == 0) { printf("Connect Success!\n"); /* 执行查询操作 */ OCIStmtPrepare(stmthp, errhp, sql, strlen(sql), OCI_NTV_SYNTAX, OCI_DEFAULT); OCIStmtExecute(svchp, stmthp, errhp, (ub4)0, (ub4)0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT); /* 定义结果集,这里只获取第一列 */ OCIDefineByPos(stmthp, &defhp, errhp, 1, (dvoid *)0, 0, SQLT_CHR, (dvoid *)0, 0, (dvoid *)0, OCI_DEFAULT); /* 把结果集打印出来 */ printf("Query Result:\n"); while (OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_NEXT, (ub4)0, OCI_DEFAULT) == OCI_SUCCESS) { char buf[1024]; OCIDefineGetString(defhp, 0, buf, sizeof(buf), OCI_ATTR_DATA_LENGTH, &status); printf("%s\n", buf); } } else { printf("Connect Error!\n"); } /* 释放资源 */ OCIHandleFree((dvoid*)stmthp, OCI_HTYPE_STMT); OCIHandleFree((dvoid*)authp, OCI_HTYPE_SESSION); OCIHandleFree((dvoid*)svchp, OCI_HTYPE_SVCCTX); OCIHandleFree((dvoid*)errhp, OCI_HTYPE_ERROR); OCITerminate(OCI_DEFAULT); return 0; }