• ADADADADAD

    oracle oci[ 编程知识 ]

    编程知识 时间:2024-12-24 18:51:14

    作者:文/会员上传

    简介:

    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可能是更好的选择。

    oracle oci.docx

    将本文的Word文档下载到电脑

    推荐度:

    下载
    热门标签: oracleoci