OCI编程自学与总结(1.0)

这段自学 OCI 编程,感觉网上这方面的资料其实也不少,只是不是很容易找到。其实 OCI 没有想象的那么复杂,如果你想深究,那应该就只是时间问题。我在网上看到有人这么写到,对于 C++ 高手来说 OCI 编程只是简单的调用接口函数而已。我个人认为,学习 OCI 编程真的没那么难的,如果你想简单的会使用。

那么接下来我就这段时间对 OCI 函数的学习及所收集的资料进行整合,用于帮助那些刚刚接触 OCI 编程的程序员,及 OCI 编程专家做以讨论及研究。当然以下贴出的程序虽然都已经在 x86_64-redhat-linux 系统, GCC 版本 4.1.1 20070105 (Red Hat 4.1.1-52) 下通过编译, OCI 每个函数的参数都有严格的类型定义,比较繁琐,下面的函数示例为了简洁说明,没有对错误进行处理,在实际应用中是应该注意的。 但有些个人结论并非正确,还请大家自己进行测验,得出正确结果后希望给予指正,在下不胜感激。

一、理论:

在这里不废话的解释什么是 OCI 及 OCI 简介。不过值得一提的是 OCI 程序的编译,下边就先对 OCI 程序怎么编译,编译过程中出现的问题做出详细解释。

1 、在此只说 UNIX/LINUX 下 OCI 编程的配置。

在 UNIX 下编译 OCI 程序需要 3 个必要条件:

(1) 需要 oci.h 文件的所在目录。一般为 ORACLE 的安装目录: /…/10.2.0/db_1/rdbms/public/ 。

(2) OCI 的静态链接库文件。静态库文件在我这是在用户目录下有个 lib 文件夹静态文件名为 ora.a ,其目录是: /user/lib 。

这个静态文件的生产方式是用户目录下有个 OCI 文件夹,目录为: /user/oci ,是 ORACLE 的应用程序,直接 make 就可以生产该静态库了。 -- 有待考核

(3) 在编译时需要再加几个静态库 -lclntsh -lm –lnsl 我想这几个应该是 ORACLE 数据库运行 OCI 程序的驱动库文件吧。如果不加则会提示你程序中所有 OCI 函数找不到其定义。另外还需要加这些库文件的所在地址。

(4) 另附 makefile 文件

 view plaincopy to clipboardprint?
FLAGS =  -g -m64  
#编译OCI程序时所用到的头文件路径  
INCLUDE_PATH =  /  
        -I ${ORACLE_HOME}/rdbms/demo /  
        -I ${ORACLE_HOME}/rdbms/public /  
        -I ${ORACLE_HOME}/plsql/public /  
        -I ${ORACLE_HOME}/network/public /  
        -I ${ORACLE_HOME}/precomp/public /  
        -I .  
#编译OCI程序时所用到的静态链接库路径  
LIB_PATH = -L${HOME}/billing/lib /  
        -L${ORACLE_HOME}/lib/ /  
        -L${ORACLE_HOME}/rdbms/lib/  
   
#编译OCI程序时所用到的静态链接库  
LIBS =/billing/billing/lib/ora.a -lm -lnsl -lclntsh  
   
myoci:myoci.cpp  
        g++ ${FLAGS} -o myoci myoci.cpp ${INCLUDE_PATH}  ${LIBS} ${LIB_PATH}  
clean:  
        rm -f ./core* myoci 
FLAGS =  -g -m64
#编译OCI程序时所用到的头文件路径
INCLUDE_PATH =  /
        -I ${ORACLE_HOME}/rdbms/demo /
        -I ${ORACLE_HOME}/rdbms/public /
        -I ${ORACLE_HOME}/plsql/public /
        -I ${ORACLE_HOME}/network/public /
        -I ${ORACLE_HOME}/precomp/public /
        -I .
#编译OCI程序时所用到的静态链接库路径
LIB_PATH = -L${HOME}/billing/lib /
        -L${ORACLE_HOME}/lib/ /
        -L${ORACLE_HOME}/rdbms/lib/
 
#编译OCI程序时所用到的静态链接库
LIBS =/billing/billing/lib/ora.a -lm -lnsl -lclntsh
 
myoci:myoci.cpp
        g++ ${FLAGS} -o myoci myoci.cpp ${INCLUDE_PATH}  ${LIBS} ${LIB_PATH}
clean:
        rm -f ./core* myoci

 注意:以上路径都是相对路径,是根据你的 ORACLE 安装目录而决定的。在此贴出只是当作参考。 Windows 下 VC++ 的配置和以上步骤差不错,把相应的所需头文件及其目录,静态文件及其链接库,添加到项目工程的配置里即可,在此不再一一指出。

2 、句柄层次

OCI 使用各种句柄操作数据库,环境句柄( Environment Handle )是所有句柄的父句柄。由于贴图不够详细我把相应的 OCI 文档及资料已经上传到我的下载中,请下载后进行查阅。
本篇文章来源于:开发学院 http://edu.codepub.com   原文链接:http://edu.codepub.com/2009/1228/19152.php

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
oci函数的详细介绍 和应用实例 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,…); 释放一个会话: OCISessionEnd(); 删除到数据源的访问 : OCIServerDetach(servhpp, errhpp, OCI_DEFAULT); 释放句柄: OCIHandleFree((dvoid *) stmthpp, OCI_HTYPE_STMT);

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值