12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
ADADADADAD
编程知识 时间:2024-12-24 18:51:14
作者:文/会员上传
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
12-09
Oracle OCI是Oracle提供的一种数据库访问方式。它是Oracle公司在Oracle数据库上提供了一套C/C++调用程序库。使用OCI可以使我们直接对Oracle数据库进行访问,控制数据库操作的
以下为本文的正文内容,内容仅供参考!本站为公益性网站,复制本文以及下载DOC文档全部免费。
Oracle OCI是Oracle提供的一种数据库访问方式。它是Oracle公司在Oracle数据库上提供了一套C/C++调用程序库。使用OCI可以使我们直接对Oracle数据库进行访问,控制数据库操作的细节,跟踪状态并处理错误。这篇文章将通过举例说明OCI带来的便利性。
OCI中用于打开连接的OCILogon()方法,允许程序员使用用户名、用户密码和TNS Name连接到Oracle数据库。以下是部分OCILogon()函数的用例。
OCIEnv *env = NULL; OCISvcCtx *svc = NULL; OCIError *err = NULL; OCISession *session = NULL; OCIServer *server = NULL; // 初始化OCI环境和错误报告 // ...... //创建服务器句柄 OCIHandleAlloc(env, (void **)&server, OCI_HTYPE_SERVER, (size_t)0, (void**)0); //获取TNS名称 text *db_name =(text *)"ora"; ub4 db_length = strlen((char *)db_name); // 链接到服务器 OCIServerAttach(server, err, db_name, db_length, OCI_DEFAULT); // 创建服务上下文句柄 OCIHandleAlloc(env, (void **)&svc, OCI_HTYPE_SVCCTX, (size_t)0, (void**)0); //将服务器句柄分配到服务上下文句柄中。 //进行参数重新设置,指定服务器句柄 OCIAttrSet(svc, OCI_HTYPE_SVCCTX, server, 0, OCI_ATTR_SERVER); //利用OCILogon函数尝试登录数据库 if (OCILogon(env, err, &svc, user_name, strlen(user_name), password, strlen(password), db_name, strlen(db_name)) != OCI_SUCCESS) { printf("Database logon error!\n"); return -1; }
OCI提供的一系列函数可以通过上述样例不断扩展,因此程序员可以完全控制数据库的访问,以实现更为底层的功能。
OCI不仅提供了连接和数据查询功能,还有许多其他功能。例如,OCI可以使用write blob操作将二进制文件保存到数据库中,我们可以利用它来将图像或文件存储在数据库里。
//定义二进制数据 char binary[10] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10}; ub4 binary_size = 10; OCILobLocator *my_lob; // 插入 BLOB 数据 int i, ret; for (i = 0; i< 10; i++) { printf("Trying to insert a lob of %d byte(s)\n", binary_size); if ((ret = OCIStmtExecute(svchp, stmthp, errhp, 1, 0, (OCISnapshot *)NULL, (OCISnapshot *)NULL, OCI_DEFAULT)) != OCI_SUCCESS) { print_error(errhp, ret); } }
OCI还可以使用Cursor来操作Oracle数据库以及设置事务。在下面的片段中,我们将展示如何实现一个基本的OCI游标。
int ret; int field_sz; char status_str[10]; OCIStmt *cursor; // ...... // 执行 SQL 语句 chkerr(errhp, OCIStmtPrepare(stmthp, errhp, (text *)query, strlen(query), OCI_NTV_SYNTAX, OCI_DEFAULT)); OCIStmtExecute(svchp, stmthp, errhp, 0, 0, NULL, NULL, OCI_DEFAULT); // 遍历结果 while ((ret = OCIStmtFetch2(stmthp, errhp, 1, OCI_FETCH_NEXT, 0, OCI_DEFAULT)) != OCI_NO_DATA) { if (ret != OCI_SUCCESS && ret != OCI_SUCCESS_WITH_INFO) { exit(1); } // 获取结果中的数据 if (OCIAttrGet(stmthp, OCI_HTYPE_STMT, (dvoid *)&field_sz, NULL, OCI_ATTR_ROW_COUNT, errhp) != OCI_SUCCESS) { printf("Error getting data from cursor\n"); } else { printf("Data Row %d : %d bytes\n", loopcnt, field_sz); loopcnt++; } }
总而言之,OCI可以使程序员对Oracle数据库进行更高级的操作。虽然OCI不如ODBC和JDBC出名,但如果你想要更精细的操作,OCI可能是更好的选择。
11-20
11-19
11-20
11-20
11-20
11-19
11-20
11-20
11-19
11-20
11-19
11-19
11-19
11-19
11-19
11-19