OCI快速入手(一) OCI简介 --张磊

 1.  概述

    OCI(Oracle Call Interfce), 即Oracle调用层接口,是Oracle公司提供的由头文件和库函数等组成的一个访问Oracle数据库的应用程序编程接口(application programming interface API),它允许开发人员在第三代编程语言(包括C\C++,COBOL和FORTRAN)中通过SQL来操纵Oracle数据库。

  2. 性能比较

       目前开发基于Oracle数据库的应用系统,可以选择多种工具,不仅用一般的数据库开发技术,如ODBC、JDBC等,同时,也可以用Oracle公司提供的专门开发工具,如Pro*C/C++、OCI等。比较这几种方式,前者是通用技术,开发起来比较容易,但弱点在于访问速度较慢, 如果要开发海量数据库应用系统, 这种速度是不能忍受的。所以需要采用OCI 开发, 因为它的访问速度比Pro* C/ C+ + 还快, 而且是一种底层接口, 几乎可以访问和控制Oracle 数据库的任何对象。由于OCI实现稍微复杂些,所以本项目组对OCI访问Oracle数据库的操作进行了封装,将OCI内部复杂函数调用转换成相对透明的函数接口,为上层应用提供效率更高、更简捷的数据库访问方式,使程序员更方便地进行数据库系统开发,达到高开发效率、程序可重用性和可维护性的目的,同时用C语言实现,平台移植性相对好一些。

 

ODBC

JDBC

PRO*C

OCI

通用性(关系数据库)

所有

大部分

Oracle

Oracle

控制层次

高层

低层

底层

底层

是否使用oracle所以高级特性

不能

不能

复杂程度

简单

简单

简单

复杂

平台移植性

一般

很好

一般

很好

访问速度

较高

很高

非常高

  3. 生成可执行程序流程

  4. 程序的基本结构

    在一个应用程序中,我们是通过调用OCI提供的库函数来实现对Oracle数据库的操纵。OCI提供了上百个函数,都是以OCI开头的函数,比如创建OCI环境的OCI函数:OCIEnvCreate()。OCI函数的一个特点或者说是难点就是它的参数特别多。一个OCI应用程序的基本结构包括:

    1)初始化OCI环境和线程;

    2)分配必要的句柄与数据结构;

    3)建立与数据库的连接以及创建用户会话;

    4)通过SQL与Oracle服务器交换数据,而后再做数据处理:

    5)结束用户会话与断开与数据库的连接;

    6)释放在程序中所分配的句柄。

    示意如图2。

  5. OCI应用程序中执行SQL的步骤

    一个SQL语句在OCI应用程序中的执行步骤一般如下:

  • 准备SQL语句。调用函数OCIStmtPrepare();
  • 在SQL语句中绑定需要输入到SQL语句中的变量。对于DML语句来说,由于它带有输入变量,我们可以通过调用一个或者多个函数OCIBindByPos()、OCIBindByName()等把输入变量的地址绑定在DML语句中的占位符中;
  • 执行SQL语句。调用OCIStmtExecute()函数。对于DDL语句到这一步就完成了一个语句的执行;
  • 描述SQL中的输出的数据。如果有必要的话,我们可以调用函数OCIParamGet()与OCIAttrGet()来获取我们所读取的记录的字段个数、字段的数据类型以及字段数据定义的最大长度。
  • 定义输出变量。对于DQL(Data Query Language)语句,即SELECT的查询语句,需要定义一定数量的变量用来接受所选择列的数据。我们可以调用OCIDeflneByPos()、OCIDefineObject()函数等来完成这个任务。也就建立SQL语句所返回的数据与应用程序中变量的关系。
  • 获取数据。我们可以调用函数OCIStmtFetch()来把用SELECT选中的记录的数据赋予应用程序中的变量。过程以及过程中调用到的函数如图3所示:

    虽然Oracle对标准的SQL语言有所扩展,但它也是建立在标准的SQL语言的基础之上。上图是一个一般SQL执行的流程图,对于不同的SQL语句,所需要的步骤也有所不同。对于DCL与DDL语句,由于没有数据的输入与输出,仅仅涉及到一些权限与定义或者删除数据库中的对象的问题,因此只需要上图的第一步与第三步便可以了。而对于DQL与DML语句,由于有数据的输入与输出,因此需要的步骤就多一些。其实,DML也可以只用两步来完成。这是因为DML语句中仅仅涉及数据的输入(即,数据从应用程序到数据库端),因此我们可以把所要输入的数据以字符串的形式放在SQL语句中。而DQL不仅可能有数据输入,而且也有数据输出(从数据库端到应用程序),因此,一个DQL语句需要如上图的六个步骤。

  6. 引用的头文件和库

   头文件:-I$(ORACLE_HOME)/precomp/public

           -I$(ORACLE_HOME)/rdbms/public

           -I$(ORACLE_HOME)/rdbms/demo

   库文件:-L$(ORACLE_HOME)/lib

           -L$(ORACLE_HOME)/lib32

           -lclntsh

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 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、付费专栏及课程。

余额充值