solaris下pro-c和oci程序设计分析与比较

上传人:bin****86 文档编号:60416446 上传时间:2018-11-16 格式:DOCX 页数:11 大小:20.35KB
返回 下载 相关 举报
solaris下pro-c和oci程序设计分析与比较_第1页
第1页 / 共11页
solaris下pro-c和oci程序设计分析与比较_第2页
第2页 / 共11页
solaris下pro-c和oci程序设计分析与比较_第3页
第3页 / 共11页
solaris下pro-c和oci程序设计分析与比较_第4页
第4页 / 共11页
solaris下pro-c和oci程序设计分析与比较_第5页
第5页 / 共11页
点击查看更多>>
资源描述

《solaris下pro-c和oci程序设计分析与比较》由会员分享,可在线阅读,更多相关《solaris下pro-c和oci程序设计分析与比较(11页珍藏版)》请在金锄头文库上搜索。

1、从本学科出发,应着重选对国民经济具有一定实用价值和理论意义的课题。课题具有先进性,便于研究生提出新见解,特别是博士生必须有创新性的成果Solaris下PRO*C和OCI程序设计分析与比较 摘要 文章对Solaris平台下,开发基于Oracle数据库的C程序的两种 方法 PRO*C和OCI进行了 研究 ,详细 分析 了这两种方法的开发流程,给出了较为具体的 应用 程序例子,并对两者的性能进行了比较。 关键词 Solaris,Oracle,PRO*C,OCI 1引言 数据库在软件开发中的应用越来越广泛,其中,Oracle可说是性能最强大、最稳定的数据库之一,大量的软件开发选择了Oracle。在开发

2、语言的选择上,C语言以其灵活、高效吸引了大批的软件开发人员。这两者的强强联合也必具有较高的性能,在实际中有广泛的应用。这就是PRO*C和OCI程序设计。Oracle常常应用在服务器中,Solaris又是服务器的首选平台,因此,本文主要介绍PRO*C和OCI程序设计在Solaris平台上的应用和实现,对在Windows平台和Linux平台上的应用和实现也可作为 参考 。本文所采用的开发环境为、。PRO*C程序设计PRO*C是Oracle提供的应用程序专用开发工具,它以C语言为宿主语言,能在C程序中嵌入SQL语句,进行数据库操作。这种嵌入式的SQL语句容易掌握,适合初学者。设置开发环境C编译器So

3、laris系统中常用的C语言编译器是GCC,是GNU组织的免费C编译器,一般Linux版本中缺省都安装有GCC,UNIX系统中有的并不自带,因此需要手动安装,本文所采用的GCC版本为。PRO*C预编译器PRO*C使用预编译技术,预编译器将源程序中的SQL语句转换为标准的Oracle库函数调用,从而生成C源程序,再经C编译器编译、链接后生成可执行文件。这个预编译器是Oracle自带的。C语言头文件和函数库。Oracle安装程序将这些文件安装在$ORACLE_HOME/precomp目录下。开发PRO*C程序说明SQL通讯区SQL通讯区用来记录执行每一个嵌入SQL语句的状态信息,通过在函数体外使用

4、下列语句实现:#include 或者 EXEC SQL INCLUDE sqlca;声明宿主变量,即C变量这些变量是应用程序与Oracle通信的桥梁,应用程序的输入数据通过C变量传递给Oracle,反之,Oracle的输出数据又通过C变量传递给应用程序。举例如下:EXEC SQL BEGIN DECLARE SECTION;char szUsername16;VARCHAR varPassword16;char *szStmt1=CREATE TABLE USERS (USERNAME VARCHAR2(15) NOT NULL,PASSWORDVARCHAR2(15) NOT NULL);c

5、har *szStmt2= SELECT PASSWORD FROM USERS WHERE USERNAME=chen;EXEC SQL END DECLARE SECTION;值得注意的是:在SQL语句中使用C变量时,前面需加冒号,例如上面的变量应表示为:szUsername。其中,VARCHAR为C扩展数据类型,预编译时,PRO*C预编译器将它扩展为一个C结构类型struct unsigned short len; unsigned char arr16; varNo; 在SQL语句中使用VARCHAR类型变量时,只需指出结构名称varPassword就可,但在C语句中使用VARCHAR

6、类型变量时,必须具体说明所操作变量的结构元素名称是还是。另外,如果用VARCHAR类型变量做函数参数的话,只能用指针形式。连接数据库EXEC SQL CONNECT :username/passwordDBname;通过的值来判断连接数据库成是否功。执行SQL语句静态SQL语句是在开发应用程序时就已经明确了的数据库操作,如:EXEC SQL SELECT password INTO :szPassword FROM USERS WHERE username=:szUsername;动态SQL语句是在运行时由外部数据提供的,不能直接在C程序中嵌入SQL 语句,但可以调用放在一个字符串变量里的SQ

7、L语句,最简单的方法是:EXEC SQL EXECUTE IMMEDIATE :szStmt1;但这样执行的SQL语句不能实现查询,实现查询可用下列方法:EXEC SQL PREPARE select_stmt FROM :szStmt2;EXEC SQL EXECUTE select_stmt INTO :szPassword;如果不再需要已准备好的语句,应释放:EXEC SQL DEALLOCATE PREPARE select_stmt;提交或回滚所做的数据库处理,并退出数据库回滚:EXEC SQL ROLLBACK WORK RELEASE;提交:EXEC SQL COMMIT WOR

8、K RELEASE;注意语句中的RELEASE选项,它要求关闭所有打开的游标,之后断开与数据库服务器的连接。生成可执行文件在Solaris平台下可通过命令方式对PRO*C源程序进行预编译,下列命令只列出了最常用的预编译选项:#proc iname= INCLUDE=path CODE=ANSI_C MODE=ANSI CPP_SUFFIX=ccSQLCHECK=SEMANTICS USERID=username/passwordDBname预编译后的文件就可以当作普通的C源文件来进行处理了。#gcc -o exampled I. -I/oracle/product/precomp/public

9、最终生成的exampled文件就是我们的可执行文件。OCI程序设计OCI(Oracle Call Interface)是由头文件和库函数等组成的一套Oracle数据库应用程序编程接口工具,OCI程序实质上就是用高级语言写的程序,其特点是内部含有对OCI子函数库的调用。OCI程序对开发环境的要求相对较低,只要有C语言的OCI开发工具包和C编译器就可以,程序设计相比PRO*C复杂了点。 创建和初始化OCI环境首先要在源程序中包含OCI头文件:#includeOCI环境即OCI函数的工作环境,在调用其他函数之前必须先调用OCIInitialize()和OCIEnvInit()函数创建和初始化OCI环

10、境,其他OCI函数要在这个环境中才能执行。先定义变量:OCIEnv *m_envhp; OCIError *m_errhp; OCIServer *m_srvhp; OCISvcCtx *m_svchp; OCIStmt *m_stmthp; OCIInitialize(ub4) OCI_DEFAULT, (dvoid *)0, (dvoid * (*)(dvoid *, size_t) 0, (dvoid * (*)(dvoid *, dvoid *, size_t)0, (void (*)(dvoid *, dvoid *) 0 ); OCIEnvInit(OCIEnv *)&m_envh

11、p, OCI_DEFAULT, (size_t) 0, (dvoid *) 0 );其中m_envhp为输出参数,是一个指向OCI环境句柄的指针,OCI_DEFAULT 是OCI环境的初始化模式。OCIEnvInit()函数中的size_t类型变量为分配给用户的内存数量,dvoid *类型变量指向用户的内存区域,该区域的大小等于size_t类型变量。OCI函数中,大量使用OCI定义的数据类型和宏,其定义可 参考 $ORACLE_HOME/rdbms/demo目录下的头文件。申请句柄句柄是指向OCI库所分配的内存区域的指针,该内存区域中的数据由OCI库维护, 应用 程序可通过句柄访问其中的数据。

12、下面是应用程序中最常用的几个句柄: OCIHandleAlloc( (dvoid *)m_envhp, (dvoid *)&m_errhp, OCI_HTYPE_ERROR, (size_t) 0, (dvoid *) 0); OCIHandleAlloc( (dvoid *)m_envhp, (dvoid *)&m_srvhp, OCI_HTYPE_SERVER, (size_t) 0, (dvoid *) 0); OCIHandleAlloc( (dvoid *)m_envhp, (dvoid *)&m_svchp, OCI_HTYPE_SVCCTX, (size_t) 0, (dvoid

13、 *) 0); OCIHandleAlloc( (dvoid *)m_envhp, (dvoid *)&m_stmthp, OCI_HTYPE_STMT, (size_t) 0, (dvoid *)0); 其中m_errhp为新申请的句柄,m_envhp为它的父环境句柄,OCI_HTYPE_ERROR为句柄类型,表示这是一个错误报告句柄,OCI_HTYPE_SERVER表示服务器句柄,OCI_HTYPE_SVCCTX表示服务环境句柄,OCI_HTYPE_STMT表示语句句柄。存储在句柄中的数据称为句柄属性,所有OCI句柄都具有属性,可以调用OCIAttrGet()和OCIAttrSet()函数

14、来读取、设置句柄属性。连接服务器建立会话首先调用OCIServerAttach(m_srvhp, m_errhp, (text *), strlen(), OCI_DEFAULT);函数建立与指定服务器的连接,text *类型变量为空,表示连接默认数据库服务,OCI_DEFAULT表示应用程序的操作模式为阻塞模式,在这种方式下,只有当OCI调用完成后才将控制权返回给客户端应用程序。然后调用OCILogon(m_envhp, m_errhp, &m_svchp, (text*)m_szUser,strlen(m_szUser),(text*)m_szPassword, strlen(m_szPa

15、ssword), (text*)m_szDbName, strlen(m_szDbName);建立数据库会话。此函数隐含申请服务器句柄和用户会话句柄,登录后,句柄是只读的,不能再设置句柄属性。执行SQL语句并处理数据将要执行的SQL语句copy到szSqlStr字符串中,snprintf( szSqlStr, sizeof(szSqlStr), select PASSWORD from USERS where USERNAME=chen );执行下列语句:OCIStmtPrepare(m_stmthp, m_errhp, (text*)szSqlStr, (ub4) strlen(szSqlStr),(ub4) OCI_NTV_SYNTAX, (ub4)OCI_DEFAULT); /准备SQL语句OCIDefine *defnp0 = (OCIDefine *) 0; /定义输出变量OCIDefineByPos( m_stmthp,

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 总结/报告

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号