OCI操作oracle数据库.doc
《OCI操作oracle数据库.doc》由会员分享,可在线阅读,更多相关《OCI操作oracle数据库.doc(33页珍藏版)》请在咨信网上搜索。
1、OCI简介1OCI概述OCI(Oracle Call Interfce,即Oracle调用层接口)是Oracle公司提供的由头文件和库函数等组成的一个访问Oracle数据库的应用程序编程接口(application programming interface API),它允许开发人员在第三代编程语言(包括C,C+,COBOL与FORTRAN)中通过SQL(Structure Query Language)来操纵Oracle数据库,而且OCI在一定程度上支持第三代编程语言(诸如C,C+,COBOL与FORTRAN)的数据类型、语法等等。OCI的显著特点是全面支持Oracle的面向对象技术,同时O
2、CI还具有如下的一些特点:1)非常有利于应用程序的设计;2)高度控制应用程序的执行;3)允许开发人员应用已熟悉的第三代程序设计语言来应用OCI;4)支持动态SQL;5)几乎所有的Oracle的开发工具都支持OCI;6)通过回调技术(callbacks)来实现动态绑定与定义;7)通过OCI的描述函数可以获取Oracle数据库的各种参数;8)增强了数组在DML(data manipulation language)语言中的应用;OCI接口支持Windows NT和Windows 95982O0oxP操作系统,它所支持的C语言编译器包括Borland C+和MicrosoftVisualC+等。在使
3、用OCI开发Oralce数据库应用程序之前,应首先安装这些操作系统和C语言编译工具。在选择安装OCI开发工具包后,Oracle安装程序将OCI文件拷贝到oracle主目录内的以下子目录中: BIN:执行文件和帮助文件: OCIINCLUDE头文件; OCILIB其中包含仍bc和msvc两个子目录,分别用于存储支持Borland C+和MicroSoflVisualC+的OCI库文件,这些库文件与OCI源程序编译后所产生的目标文件进行链接生成可执行程序。一个应用OCI程序的生成可执行应用程序的过程如图1:图由此,我们可以看出:一个应用OCI的应用程序与其它不连接数据库的应用程序生成可执行程序的过
4、程没有区别,在程序的链接阶段OCI库与源程序的目标代码文件链接而生成可执行程序。2OCI程序的基本结构在一个应用程序中,我们是通过调用OCI提供的库函数来实现对Oracle数据库的操纵。OCI提供了上百个函数,都是以OCI开头的函数,比如创建OCI环境的OCI函数:OCIEnvCreate()。OCI函数的一个特点或者说是难点就是它的参数特别多,函数往往都有十几个参数。一般情况下,一个OCI应用程序都是在多用户环境下的。在一个n层网络结构的配置中,客户端的应用程序需要完成一些数据操纵,包括交换数据与处理数据。一个OCI应用程序的基本结构包括:1)初始化OCI环境和线程;2)分配必要的句柄与数据
5、结构;3)建立与数据库的连接以及创建用户会话;4)通过SQL与Oracle服务器交换数据,而后再做数据处理:5)结束用户会话与断开与数据库的连接;6)释放在程序中所分配的句柄。示意如图2。3在OCI应用程序中执行SQL的步骤结构化查询语言(SQL Structure Query Language)是操纵关系数据库的主流语言,目前,几乎所有的商业数据库软件都支持SQL语言。标准的SQL语言按照它的功能不同,可以分为查询、操纵、定义以及控制四种类型。每一种都有若干关键字,具体如表1所示。一个SQL语句在OCI应用程序中的执行步骤一般如下:1) 准备SQL语句。调用函数OCIStmtPrepare(
6、);2)在SQL语句中绑定需要输入到SQL语句中的变量。对于DML语句来说,由于它带有输入变量,我们可以通过调用一个或者多个函数OCIBindByPos()、OCIBindByName()等把输入变量的地址绑定在DML语句中的占位符中;3)执行SQL语句。调用OCIStmtExecute()函数。对于DDL语句到这一步就完成了一个语句的执行;4)描述SQL中的输出的数据。如果有必要的话,我们可以调用函数OCIParamGet()与OCIAttrGet()来获取我们所读取的记录的字段个数、字段的数据类型以及字段数据定义的最大长度。5)定义输出变量。对于DQL(Data Query Languag
7、e)语句,即SELECT的查询语句,需要定义一定数量的变量用来接受所选择列的数据。我们可以调用OCIDeflneByPos()、OCIDefineObject()函数等来完成这个任务。也就建立SQL语句所返回的数据与应用程序中变量的关系。6)获取数据。我们可以调用函数OCIStmtFetch()来把用SELECT选中的记录的数据赋予应用程序中的变量。过程以及过程中调用到的函数如图3所示:虽然Oracle对标准的SQL语言有所扩展,但它也是建立在标准的SQL语言的基础之上。上图是一个一般SQL执行的流程图,对于不同的SQL语句,所需要的步骤也有所不同。对于DCL与DDL语句,由于没有数据的输入与
8、输出,仅仅涉及到一些权限与定义或者删除数据库中的对象的问题,因此只需要上图的第一步与第三步便可以了。而对于DQL与DML语句,由于有数据的输入与输出,因此需要的步骤就多一些。其实,DML也可以只用两步来完成。这是因为DML语句中仅仅涉及数据的输入(即,数据从应用程序到数据库端),因此我们可以把所要输入的数据以字符串的形式放在SQL语句中。而DQL不仅可能有数据输入,而且也有数据输出(从数据库端到应用程序),因此,一个DQL语句需要如上图的六个步骤。OCI环境配置Oracleoci工具包安装: $ORACLE_HOMEBIN:执行文件和help文件 $ORACLE_HOMEOCIINCLUDE:
9、头文件 $ORACLE_HOMEOCILIBBC:forBorlanfC+的OCI库 $ORACLE_HOMEOCILIBMSVC:forMSVisualC+的OCI库 如果是unix下,对于ORACLE8i,则OCI库在$ORACLE_HOME/lib下,如果是9i,则在$ORACLE_HOME/lib32下,库文件名一般为libclntsh.so 以上所有过程,只需安装一个oracle客户端,oci的所有头文件和库文件全部包含在内,VC开发时只需包含指定的头文件,引用相关库即可。OCI实现操作oracle数据库1创建OCI环境即创建和初始化OCI工作环境,其他的OCI函数需要OCI环境才能
10、执行。 2需要申请的句柄类型OCI环境句柄:OCI_HTYPE_ENV它定义所有OCI函数的环境调用环境,是其他句柄的父句柄。(由OCIEnvInit或OCIEnvCreate生成) 错误句柄:OCI_HTYPE_ERROR作为一些OCI函数的参数,用来记录这些OCI函数操作过程中所产生的错误,当有错误发生时,可用COIErrorGet()来读取错误句柄中记录的错误信息。 服务器环境句柄:OCI_HTYPE_SVCCTX定义OCI调用的服务器操作环境,它包含服务器、用户会话和事务三种句柄。 服务器句柄:OCI_HTYPE_SERVER标识数据源,它转换为与服务器的物理连接。 用户会话句柄:OC
11、I_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_SESS
12、ION设置/读取服务环境的会话认证环境属性 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_STM
13、T_TYPE读取当前SQL语句的类型: Eg:OCI_STMT_BEGIN OCI_STMT_SELECTOCI_STMT_INSERT OCI_STMT_UPDATEOCI_STMT_DELETE OCI_ATTR_PARAM_COUNT返回语句选择列表中的列数 4关于输出变量定义如果在语句执行前就知道select语句的选择列表结构,则定义输出操作可在调用OCISTMTExecute前进行,如果查询语句的参数为用户动态输入的,则必须在执行后定义。 5OCI函数返回值OCI_SUCCESS函数执行成功(=0) OCI_SUCCESS_WITH_INFO执行成功,但有诊断消息返回,可能是警告信息
14、 OCI_NO_DATA函数执行完成,但没有其他数据 OCI_ERROR函数执行错误 OCI_INVALID_HANDLE传递给函数的参数为无效句柄,或传回的句柄无效 OCI_NEED_DATA需要应用程序提供运行时刻的数据 OCI_CONTINUE回调函数返回代码,说明回调函数需要OCI库恢复其正常的处理操作 OCI_STILL_EXECUTING服务环境建立在非阻塞模式,OCI函数调用正在执行中。6OCI连接有二种方式Blocking(阻塞方式)和non_Blocking(非阻塞方式),阻塞方式就是当调用OCI操作时,必须等到此OCI操作完成后服务器才返回客户端相应的信息,不管是成功还是失
15、败。非阻塞方式是当客户端提交OCI操作给服务器后,服务器立即返回OCI_STILL_EXECUTING信息,而并不等待服务端的操作完成。对于non-blocking方式,应用程序若收到一个OCI函数的返回值为OCI_STILL_EXECUTING时必须再次对每一个OCI函数的返回值进行判断,判断其成功与否。 可通过设置服务器属性为OCI_ATTR_NONBLOCKING_MODE来实现。系统默认方式为阻塞模式. 7OCI函数设置的模式 OCI_DEFUALT:使用OCI默认的环境 OCI_THREADED:线程环境下使用OCI OCI_OBJECT:对象模式 OCI_SHARED:共享模式 O
16、CI_EVENTS OCI_NO_UCB OCI_ENV_NO_MUTEX:非互斥访问模式 其中模式可以用逻辑运算符进行迭加,将函数设置成多多种模式:如mode=OCI_SHREADED|OCI_OBJECT 8事务当应用进程与服务器断开连接时,程序没有使用OCITransCommit()进行事务的提交,则所有活动的事务会自动回滚。 9OCI重定义数据类型 typedefunsignedcharub1; typedefsignedcharsb1; typedefunsignedshortub2; typedefsignedshortsb2; typedefunsignedintub4; typ
17、edefsignedintsb4; typedefub4duword; typedefsb4dsword; typedefdsworddword;10属性操作在SQL语句准备后,可以用OCIAttrSet(0设置该语句的类型属性OCI_ATTR_STMT_TYPE,以后可读取语句属性,根据属性分别进行处理。 11批量绑定输入和定义输出参数将数据存入一个静态数据组中。一次执行可以提交或读取多行记录值。 12占位符和指示器变量占位符:在程序中,一些SQL语句需要在程序运行时才能确定它的语句数据,在设计时可用一个占位符来代替,当程序运行时,在它准备好语句后,必须为每个占位符指定一个变量,即将占位符与
18、程序变量地址结合,执行时,Oracle就从这些变量中读取数据,并将它们与SQL语句一起传递给Oracle服务器执行。OCI结合占位符时,它将占位符与程序变量关联起来,并同时要指出程序变量的数据类型和数据长度。 如:select*fromtestwherename=:p1andage:p2 :p1和:p2为占位符 指示器变量:由于在Oracle中,列值可以为NULL,但在C语言中没有NULL值,为了能使OCI程序表达NULL列值,OCI函数允许程序为所执行语句中的结合变量同时关联一个指示符变量或指示符变量数组,以说明所结合的占位符是否为NULL或所读取的列值是否为NULL,以及所读取的列值是否被
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OCI 操作 oracle 数据库
1、咨信平台为文档C2C交易模式,即用户上传的文档直接被用户下载,收益归上传人(含作者)所有;本站仅是提供信息存储空间和展示预览,仅对用户上传内容的表现方式做保护处理,对上载内容不做任何修改或编辑。所展示的作品文档包括内容和图片全部来源于网络用户和作者上传投稿,我们不确定上传用户享有完全著作权,根据《信息网络传播权保护条例》,如果侵犯了您的版权、权益或隐私,请联系我们,核实后会尽快下架及时删除,并可随时和客服了解处理情况,尊重保护知识产权我们共同努力。
2、文档的总页数、文档格式和文档大小以系统显示为准(内容中显示的页数不一定正确),网站客服只以系统显示的页数、文件格式、文档大小作为仲裁依据,平台无法对文档的真实性、完整性、权威性、准确性、专业性及其观点立场做任何保证或承诺,下载前须认真查看,确认无误后再购买,务必慎重购买;若有违法违纪将进行移交司法处理,若涉侵权平台将进行基本处罚并下架。
3、本站所有内容均由用户上传,付费前请自行鉴别,如您付费,意味着您已接受本站规则且自行承担风险,本站不进行额外附加服务,虚拟产品一经售出概不退款(未进行购买下载可退充值款),文档一经付费(服务费)、不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
4、如你看到网页展示的文档有www.zixin.com.cn水印,是因预览和防盗链等技术需要对页面进行转换压缩成图而已,我们并不对上传的文档进行任何编辑或修改,文档下载后都不会有水印标识(原文档上传前个别存留的除外),下载后原文更清晰;试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓;PPT和DOC文档可被视为“模板”,允许上传人保留章节、目录结构的情况下删减部份的内容;PDF文档不管是原文档转换或图片扫描而得,本站不作要求视为允许,下载前自行私信或留言给上传者【天****】。
5、本文档所展示的图片、画像、字体、音乐的版权可能需版权方额外授权,请谨慎使用;网站提供的党政主题相关内容(国旗、国徽、党徽--等)目的在于配合国家政策宣传,仅限个人学习分享使用,禁止用于任何广告和商用目的。
6、文档遇到问题,请及时私信或留言给本站上传会员【天****】,需本站解决可联系【 微信客服】、【 QQ客服】,若有其他问题请点击或扫码反馈【 服务填表】;文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“【 版权申诉】”(推荐),意见反馈和侵权处理邮箱:1219186828@qq.com;也可以拔打客服电话:4008-655-100;投诉/维权电话:4009-655-100。