这段自学 OCI 编程,感觉网上这方面的资料其实也不少,只是不是很容易找到。其实 OCI 没有想象的那么复杂,如果你想深究,那应该就只是时间问题。我在网上看到有人这么写到,对于 C++ 高手来说 OCI 编程只是简单的调用接口函数.
服务器句柄 ( Server Handle ),用户会话句柄( User Session Handle ),事务句柄( Transaction Handle )隶属于服务上下文句柄( Service Context Handle ),但都是以环境句柄为父句柄分配的。
查询输出定位句柄( Define Handle )和输入输出绑定变量句柄( Bind Handle )在执行具体的 SQL 语句的时候,被隐含创建并连接到表达句柄( Statement Handle )上,当表达句柄释放时,它们也被隐含释放。所以在执行每一个 sql 语句时,先分配表达句柄,执行结束后,释放表达句柄,这样做保证不发生由于定位句柄和绑定变量句柄引起的内存泄漏。
3 、连接 ORACLE 数据库流程
OCI 连接过程十比较复杂,除了分配设置各个基本句柄外,还要明确彼此之间的联系,大致流程如下:
创建环境句柄: OCIEnvCreate(&envhp, …);
创建一个指定环境的错误句柄: OCIHandleAlloc((dvoid *)envhp, (dvoid **)&errhp,…);
创建一个指定环境的服务句柄: OCIHandleAlloc((dvoid *)envhp, (dvoid **)&servhp,…);
建立到数据源的访问路径 : OCIServerAttach(servhpp, errhpp,…);
创建一个指定环境的服务上下文句柄: (void) OCIHandleAlloc((dvoid *)envhpp,…);
为指定的句柄及描述符设置特定的属性: (void) OCIAttrSet((dvoid *)svchpp,…);
创建一个指定环境的用户连接句柄: (void) OCIHandleAlloc((dvoid *)envhpp,…);
为用户连接句柄设置登录名及密码: (void) OCIAttrSet((dvoid *)usrhpp,…);
认证用户建立一个会话连接: OCISessionBegin(svchpp, errhpp,…);
创建一个句子句柄: OCIHandleAlloc((dvoid *)envhpp,…);s
准备 SQL 语句: OCIStmtPrepare(stmthpp, errhpp,…);
绑定输入变量: OCIBindByPos(stmtp &hBind, errhp,…);
绑定输出变量: OCIDefineByPos(stmthpp, &bhp1, errhpp,…);
获得 SQL 语句类型: OCIAttrGet ((dvoid *)stmthpp, (ub4)OCI_HTYPE_STMT,…);
执行 SQL 语句: OCIStmtExecute(svchpp, stmthpp,…);
释放一个会话: OCISessionRelease();
删除到数据源的访问 : OCIServerDetach(servhpp, errhpp, OCI_DEFAULT);
释放句柄: OCIHandleFree((dvoid *) stmthpp, OCI_HTYPE_STMT);
二、实践:
我把程序贴到该文章的第二篇中,以下针对应用得以分析并进行说明。
三、基本理论:
1 、创建 OCI 环境即创建和初始化 OCI 工作环境,其他的 OCI 函数需要 OCI 环境才能执行。
2 、需要申请的句柄类型:
OCI 环境句柄: OCI_HTYPE_ENV— 它定义所有 OCI 函数的环境调用环境,是其他句柄的父句柄。 ( 由 OCIEnvInit 或 OCIEnvCreate 生成 ) 。
错误句柄: OCI_HTYPE_ERROR— 作为一些 OCI 函数的参数,用来记录这些 OCI 函数操作过程中所产生的错误,当有错误发生时,可用 COIErrorGet() 来读取错误句柄 中记录的错误信息。
服务器环境句柄: OCI_HTYPE_SVCCTX— 定义 OCI 调用的服务器操作环境,它包含服务器、用户会话和事务三种句柄。
服务器句柄: OCI_HTYPE_SERVER— 标识数据源,它转换为与服务器的物理连接。
用户会话句柄: OCI_HTYPE_SESSION— 定义用户角色和权限及 OCI 调用的执行环境。
事务句柄: OCI_HTYPE_TRANS— 定义执行 SQL 操作的事务环境,事务环境中包含用户的会话状态信息。
语句句柄: OCI_HTYPE_STMT— 是一个标识 SQL 语句或 PL/SQL 块,以及其相关属性的环境。
Bind/Define 句柄:属于语句句柄的子句柄,由 OCI 库隐式自动生成。用户不需要自己再申请, OCI 输入变量存储在 bind 句柄中,输出变量存储在定义句柄中。
3 、句柄属性包括:
服务器环境句柄属性: (OCI_HTYPE_SVCCTX)
OCI_ATTR_SERVER— 设置 / 读取服务环境的服务器环境属性
OCI_ATTR_SESSION— 设置 / 读取服务环境的会话认证环境属性
OCI_ATTR_TRANS— 设置 / 读取服务环境的事务环境属性
用户会话句柄属性: (OCI_HTYPE_SESSION)
OCI_ATTR_USERNAME— 设置会话认证所使用的用户名
OCI_ATTR_PASSWORD— 设置会话认证所使用的用户口令
服务器句柄: (OCI_HTYPE_SEVER)
OCI_ATTR_NOBLOCKING_MODE— 设置 / 读取服务器连接: =TRUE 时服务器连接设置为非阻塞方式
语句句柄: (OCI_HTYPE_STMT)
OCI_ATTR_ROW_COUNT— 只读,为当前已处理的行数,其 default=1
OCI_ATTR_STMT_TYPE— 读取当前 SQL 语句的类型:
4 、 OCI 函数返回值:
OCI_SUCCESS – 函数执行成功 (=0)
OCI_SUCCESS_WITH_INFO – 执行成功,但有诊断消息返回,可能是警告信息
OCI_NO_DATA— 函数执行完成,但没有其他数据
OCI_ERROR— 函数执行错误
OCI_INVALID_HANDLE— 传递给函数的参数为无效句柄,或传回的句柄无效