OCI学习资料
--Oracle8及以后版本的OCI 1.简介
Oracle调用接口(Oracle Call Interface)是一个让我们通过函数调用来访问Oracle数据库和控制SQL语句执行各个阶段的应用程序编程接口(API)。OCI支持C和C++的数据类型、调用惯例、语法和语义。
1.1创建一个OCI应用程序
我们编译和连接一个OCI程序的方法与编译和连接一个非数据库应用程序的方法相同。不需要独立的预处理或者预编译步骤。
1.2OCI的组成部分
OCI具有如下功能:
·能够安全地支持大量用户的灵活的、多线程API集合。
·为管理数据库访问、处理SQL语句和管理Oracle数据库对象的SQL访问函数。
·管理Oracle类型的数据属性的数据类型映射和操作函数。
·不经SQL语句直接向数据库加载数据的数据加载函数。
1.3封装的接口
所有的OCI函数使用的数据结构都以被称为句柄的不透明的接口之形式封装。句柄是指向OCI库分配的保存着上下文信息、连接信息、错误信息或者关于SQL及PL/SQL的绑定信息的不透明指针。客户端分配一定类型的句柄,通过已经定义好的接口来填充一个或者多个句柄,并通过这些句柄向服务器发送请求。应用程序可以通过访问函数来访问句柄中包含的相关信息。
2.OCI基本编程
这部分介绍OCI编程中涉及到的基本概念。
2.1OCI编程概要
一个OCI应用程序的基本目标就是代表多个用户进行数据库操作。
OCI使用以下基本编程顺序:
1.初始化OCI编程环境和线程。
2.分配必要的句柄,并且设置服务器连接和用户会话。
3.通过在服务器上执行SQL语句来交换数据,并且执行必要的应用程序数据处理。
4.执行准备好的语句或者准备即将要执行的语句。
5.终止用户会话并且断开服务器连接。
6.释放句柄。
图2-1显示了一个OCI应用程序的编程步骤。
图2-1
这幅图及其所列出的步骤提供了一个OCI编程步骤的简单概括。根据程序的功能,变化是完全可能发生的。包含管理多个会话、事务和使用对象的更复杂的OCI应用程序需要另外的步骤。
所有的OCI函数调用都在一个环境中执行。在一个OCI进程中可以有多个环境。如果一个环境需要任何进程级别的初始化,则其自动进行。
注意:在一个OCI应用程序中可以有多个活动连接和语句。
2.2OCI数据结构
句柄(Handles)和描述符(descriptors)是OCI应用程序中定义的不透明的数据结构。它们可以被直接分配、通过特殊的分配函数或者可以被OCI函数隐式地分配。
7.X 升级注意:以前写过7.XOCI应用程序的程序员必须熟悉这些被大多数OCI函数使用的数据结构。
句柄和描述符保存有关数据、连接、或者应用程序行为的信息。
2.3句柄
几乎每一个OCI函数的参数列表中都包含有一个或者多个句柄。一个句柄是一个指向一个OCI库分配的
存储区域的不透明的指针。我们使用句柄来保存上下文信息或者连接信息,(例如,一个环境或者服务句柄),或者它可以保存关于OCI函数或者数据的信息(例如,一个错误句柄或者描述句柄)。句柄可以使编程更简单,因为OCI库会维持这些数据而不是应用程序。
大多数OCI应用程序需要使用句柄中的信息。获取属性值和设置属性值的OCI函数,OCIAttrGet()和OCIAttrSet(),获取和设置这些信息。
表2-1 列出了OCI中定义的句柄。并列出了与每一种句柄类型相对应的C数据类型和OCI函数中使用的用来识别OCI调用中的句柄类型的句柄类型常量。
表2-1 OCI句柄类型
分配和释放句柄
我们的应用程序要为一个特定的环境句柄分配所有的句柄(除了绑定句柄bind handle、定义句柄define handle和线程句柄thread handles)。我们把环境句柄作为一个参数传递至句柄分配函数。然后,被分配的句柄就特定于那个特定的环境。
绑定句柄和定义句柄是为一个语句句柄分配的,并且包含了关于那个句柄所代表的语句的信息。
注意:绑定句柄和定义句柄是由OCI库隐式分配的,不需要用户分配。
图2-2 显示了不同类型的句柄的层次
图2-2 句柄的层次
环境句柄是由OCIEnvCreate()或者OCIEnvNlsCreate()函数分配和初始化的,所有的OCI 程序都需要执行它们中的任一个。
所有的用户分配的句柄都通过OCI句柄分配函数来初始化,即OCIHandleAlloc()函数。
句柄类型包括:线程句柄、描述句柄、语句句柄、服务上下文句柄、错误句柄和服务器句柄等。
线程句柄通过OCIThreadHndInit()函数分配。
一个应用程序必须释放所有的不再使用的句柄。OCIHandleFree()函数释放所有的句柄。
注意:当一个父句柄被释放后,所有与之相连的子句柄也被释放并且再也不能被使用。例如,当一个语句句柄释放后,任何与之相连的绑定和定义句柄也都被释放。
句柄减少了对全局变量的需要。句柄也使错误报告更容易。一个错误句柄用来返回错误和诊断信息。
2.3.1环境句柄
环境句柄提供了一个所有的OCI函数被调用的上下文。每一个环境句柄包含一个支持快速访问的内存缓存。所有的环境句柄下的内存分配都是通过这个缓存完成的。如果多个线程想要在同一个环境句柄下分
配内存,则它们对缓存的访问是序列化的。当多个线程共享一个单独的环境句柄时,它们会阻塞对缓存的访问。
环境句柄作为OCIHandleAlloc()函数的parent参数来分配其他句柄类型。绑定句柄和定
义句柄是隐式分配的。
2.3.2错误句柄server error翻译
错误句柄作为一个参数传递至大多数OCI函数。错误句柄维持着关于一个OCI操作中所发生的错误的信息。如果一个函数调用中发生了一个错误,错误句柄可以传给OCIErrorGet()函数来获取关于那个错误的额外信息。
由于大多数OCI函数都需要一个错误句柄作为一个参数,分配错误句柄是一个OCI应用程序中的前几个步骤之一。
2.3.3服务上下文句柄和相关的句柄
一个服务上下文句柄定义了决定OCI调用的上下文的属性。服务上下午句柄包含3个句柄作为它的属性,分别代表一个服务器连接、一个用户会话和一个事务。图2-3列出了这些属性
图2-3
·一个服务器句柄Server Handle识别对一个数据库的连接。
·一个用户会话句柄User Session Handle定义了一个用户的角和权限以及函数执行的操作上下文。
·一个事务句柄定义了SQL操作所属的事务。
在需要更复杂的会话管理的应用程序中,服务上下午句柄必须被显式地分配,并且服务器句柄和用户会话句柄必须通过OCIAttrSet()函数被显式地设置到服务上下午句柄中。OCIServerAttach()函数和OCISessionBegin()函数分别初始化服务器和用户会话句柄。
当应用程序对数据库做修改时,OCI自动隐式分配的事务句柄正确地工作。
2.3.4语句句柄、绑定句柄和定义句柄
一个语句句柄是识别SQL或者PL/SQL语句以及与之相连的属性的上下文,如图2-4所示
图2-4
关于输入绑定变量和输出绑定变量的信息储存于绑定句柄中bind handle。OCI库为每一个与OCIBindByName()函数或者OCIBindByPos()函数相连的占位符分配一个绑定句柄。用户一定不可以分配绑定句柄。它们是由绑定函数隐式分配的。
查询返回的数据根据定义句柄(define handle)的描述来转换和获取。OCI库为每一个

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。