c oracle 不安装客户端

如果想要在C程序中访问Oracle数据库,通常需要安装Oracle客户端。但是,有时由于各种原因(例如权限限制、协议问题等),安装客户端可能会遇到一些麻烦。为了解决这个问题,我们可以使用OCI(Oracle Call Interface)库来实现Oracle客户端的功能。

OCI是Oracle提供的一个C语言库,用于访问Oracle数据库,包含了所有的客户端功能,而且不需要安装任何客户端软件。使用OCI可以实现对Oracle数据库的连接管理、SQL语句执行、数据读写等操作,可以完成大部分常见的数据库操作。

下面我们来看一个简单的例子:在不安装Oracle客户端的情况下,使用OCI库连接Oracle数据库,执行SQL语句,输出查询结果。

#include #include #include int main(void) { OCIEnv *envhp; OCIServer *srvhp; OCIError *errhp; OCISession *sesnhp; OCIStmt *stmthp; OCIDefine *defhp; OCIBind *bindhp; sword status; text *errmsg; int empno; char ename[20]; float sal; text sqlstmt[100] = "SELECT empno, ename, sal FROM emp WHERE empno = :1"; sword id = 7900; // 创建OCI环境句柄 OCIEnvCreate(&envhp, OCI_DEFAULT, 0, 0, 0, 0, 0, 0); // 分配OCI错误句柄 OCIHandleAlloc(envhp, (dvoid **)&errhp, OCI_HTYPE_ERROR, 0, 0); // 分配OCI服务器句柄 OCIHandleAlloc(envhp, (dvoid **)&srvhp, OCI_HTYPE_SERVER, 0, 0); // 创建OCI服务器上下文句柄 OCIServerAttach(srvhp, errhp, "XE", strlen("XE"), OCI_DEFAULT); // 分配OCI会话句柄 OCIHandleAlloc(envhp, (dvoid **)&sesnhp, OCI_HTYPE_SESSION, 0, 0); // 设置OCI会话到OCI服务器上 OCIAttrSet(sesnhp, OCI_HTYPE_SESSION, srvhp, 0, OCI_ATTR_SERVER, errhp); // 控制OCI会话连接到Oracle数据库 OCIAttrSet(sesnhp, OCI_HTYPE_SESSION, "demo", strlen("demo"), OCI_ATTR_USERNAME, errhp); OCIAttrSet(sesnhp, OCI_HTYPE_SESSION, "123456", strlen("123456"), OCI_ATTR_PASSWORD, errhp); // 开始OCI会话 OCIHandleAlloc(envhp, (dvoid **)&sesnhp, OCI_HTYPE_SESSION, 0, 0); OCIAttrSet(sesnhp, OCI_HTYPE_SESSION, srvhp, 0, OCI_ATTR_SERVER, errhp); OCIAttrSet(sesnhp, OCI_HTYPE_SESSION, "demo", strlen("demo"), OCI_ATTR_USERNAME, errhp); OCIAttrSet(sesnhp, OCI_HTYPE_SESSION, "123456", strlen("123456"), OCI_ATTR_PASSWORD, errhp); OCISessionBegin(srvhp, errhp, sesnhp, OCI_CRED_RDBMS, OCI_DEFAULT); // 分配OCI语句句柄 OCIHandleAlloc(envhp, (dvoid **)&stmthp, OCI_HTYPE_STMT, 0, 0); // 准备SQL语句 OCIStmtPrepare(stmthp, errhp, sqlstmt, strlen(sqlstmt), OCI_NTV_SYNTAX, OCI_DEFAULT); // 绑定输入变量 OCIBindByName(stmthp, &bindhp, errhp, ":1", strlen(":1"), &id, sizeof(id), SQLT_INT, 0, 0, 0, 0, 0, OCI_DEFAULT); // 定义输出变量 OCIDefineByPos(stmthp, &defhp, errhp, 1, &empno, sizeof(empno), SQLT_INT, 0, 0, 0, OCI_DEFAULT); OCIDefineByPos(stmthp, &defhp, errhp, 2, &ename, sizeof(ename), SQLT_STR, 0, 0, 0, OCI_DEFAULT); OCIDefineByPos(stmthp, &defhp, errhp, 3, &sal, sizeof(sal), SQLT_FLT, 0, 0, 0, OCI_DEFAULT); // 执行SQL语句 OCIStmtExecute(sesnhp, stmthp, errhp, 1, 0, 0, 0, OCI_DEFAULT); // 输出查询结果 printf("|%d|%s|%f|", empno, ename, sal); // 释放OCI资源 OCIHandleFree(envhp, OCI_HTYPE_STMT, stmthp); OCIHandleFree(envhp, OCI_HTYPE_SESSION, sesnhp); OCIHandleFree(envhp, OCI_HTYPE_SERVER, srvhp); OCIHandleFree(envhp, OCI_HTYPE_ERROR, errhp); OCIHandleFree(envhp, OCI_HTYPE_ENV, envhp); return 0; }