网站首页 | 论文指导 | 经济论文 | 理工论文 | 管理论文 | 法律论文 | 行政论文 | 英语论文
艺术论文 | 农学论文 | 医学论文 | 文史论文 | 教育教学论文 | 论文定制 | 论文发表
论文库分类>>> 点这里访问轻松论文网主站>>>
您当前的位置:轻松论文网 -> 论文中心 -> 理工论文 -> 计算机与信息技术论文 -> 文章内容 退出登录 用户管理
 子栏目导航
· 计算机与信息技术论文
· 电子通信网络论文
· 自动化论文
· 土建水利论文
· 交通运输论文
· 化学与化工论文
· 石油与能源动力论文
· 机械制造论文
· 矿业与冶金论文
· 工程论文
· 生命环境论文
· 材料科学与工程
· 综合论文
 最新推荐
· 选择与规则(中)-政治哲...
· 中国大陆国际政治理论研...
· 中国大陆国际政治理论研...
· 自由派?自由左派还是自...
· 信息与政策及其制度分析...
· 保守与错位-政治哲学
· 国际安全的基本哲理范式...
· 传统科举制的技术、制度...
· 从主权的双重结构看中国...
· 面向21世纪政治学研究的...
· 全球主义与国家主义(上...
· 非营利组织与民主-政治哲...
 热门文章
· 开题报告的格式(通用...
· 怎样写开题报告
· [图文] 开题报告范文1(银行...
· 开题报告范文2(网上...
· 毕业论文开题报告-A...
· 开题报告范文3(网络...
· 开题报告的撰写方法...
· 开题报告撰写的方法...
· 毕业论文例文评析
· 选题的原则
 相关文章
· 三种嵌入式操作系统...
· [图文] 虚拟演播室系统设备...
 
Solaris下PRO*C和OCI程序设计分析与比较
作者:佚名  来源:不详  发布时间:2007-2-17 10:29:03  发布人:admin

减小字体 增大字体

摘要 文章对Solaris平台下,开发基于Oracle数据库的C程序的两种方法——PRO*C和OCI进行了研究,详细分析了这两种方法的开发流程,给出了较为具体的应用程序例子,并对两者的性能进行了比较。 
关键词 Solaris,Oracle,PRO*C,OCI
1引言
数据库在软件开发中的应用越来越广泛,其中,Oracle可说是性能最强大、最稳定的数据库之一,大量的软件开发选择了Oracle。在开发语言的选择上,C语言以其灵活、高效吸引了大批的软件开发人员。这两者的强强联合也必具有较高的性能,在实际中有广泛的应用。这就是PRO*C和OCI程序设计。
Oracle常常应用在服务器中,Solaris又是服务器的首选平台,因此,本文主要介绍PRO*C和OCI程序设计在Solaris平台上的应用和实现,对在Windows平台和Linux平台上的应用和实现也可作为参考。本文所采用的开发环境为Solaris2.8、Oracle8.1.7。
2 PRO*C程序设计
PRO*C是Oracle提供的应用程序专用开发工具,它以C语言为宿主语言,能在C程序中嵌入SQL语句,进行数据库操作。这种嵌入式的SQL语句容易掌握,适合初学者。
2.1设置开发环境
(1)C编译器
Solaris系统中常用的C语言编译器是GCC,是GNU组织的免费C编译器,一般Linux版本中缺省都安装有GCC,UNIX系统中有的并不自带,因此需要手动安装,本文所采用的GCC版本为3.2。
(2)PRO*C预编译器
PRO*C使用预编译技术,预编译器将源程序中的SQL语句转换为标准的Oracle库函数调用,从而生成C源程序,再经C编译器编译、链接后生成可执行文件。这个预编译器是Oracle自带的。
(3)C语言头文件和函数库。
Oracle安装程序将这些文件安装在$ORACLE_HOME/precomp目录下。
2.2开发PRO*C程序
(1)说明SQL通讯区
SQL通讯区用来记录执行每一个嵌入SQL语句的状态信息,通过在函数体外使用下列语句实现:
#include  或者 EXEC SQL INCLUDE sqlca;
(2)声明宿主变量,即C变量
这些变量是应用程序与Oracle通信的桥梁,应用程序的输入数据通过C变量传递给Oracle,反之,Oracle的输出数据又通过C变量传递给应用程序。举例如下:
EXEC SQL BEGIN DECLARE SECTION;
char szUsername[16];
VARCHAR varPassword[16];
char *szStmt1="CREATE TABLE USERS (USERNAME VARCHAR2(15) NOT NULL,PASSWORD
VARCHAR2(15) NOT NULL)";
char *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 arr[16];
}varNo;
在SQL语句中使用VARCHAR类型变量时,只需指出结构名称varPassword就可,但在C语句中使用VARCHAR类型变量时,必须具体说明所操作变量的结构元素名称是varPassword.len还是varPassword.arr。另外,如果用VARCHAR类型变量做函数参数的话,只能用指针形式。
(3)连接数据库
EXEC SQL CONNECT :username/password@DBname;
通过sqlca.sqlcode的值来判断连接数据库成是否功。
(4)执行SQL语句(分为静态SQL语句和动态SQL语句)
静态SQL语句是在开发应用程序时就已经明确了的数据库操作,如:
EXEC SQL SELECT password INTO :szPassword FROM USERS WHERE username=:szUsername;
动态SQL语句是在运行时由外部数据提供的,不能直接在C程序中嵌入SQL 语句,但可以调用放在一个字符串变量里的SQL语句,最简单的方法是: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;
(5)提交或回滚所做的数据库处理,并退出数据库
回滚:EXEC SQL ROLLBACK WORK RELEASE;
提交:EXEC SQL COMMIT WORK RELEASE;
注意语句中的RELEASE选项,它要求关闭所有打开的游标,之后断开与数据库服务器的连接。
2.3生成可执行文件
在Solaris平台下可通过命令方式对PRO*C源程序进行预编译,下列命令只列出了最常用的预编译选项:#proc iname=example.c INCLUDE=path CODE=ANSI_C MODE=ANSI CPP_SUFFIX=cc 
SQLCHECK=SEMANTICS USERID=username/password@DBname
预编译后的example.cc文件就可以当作普通的C源文件来进行处理了。
#gcc -o exampled –I. -I/oracle/product/8.1.7/precomp/public example.cc
最终生成的exampled文件就是我们的可执行文件。

3 OCI程序设计
OCI(Oracle Call Interface)是由头文件和库函数等组成的一套Oracle数据库应用程序编程接口工具,OCI程序实质上就是用高级语言写的程序,其特点是内部含有对OCI子函数库的调用。
OCI程序对开发环境的要求相对较低,只要有C语言的OCI开发工具包和C编译器就可以,程序设计相比PRO*C复杂了点。
3.1创建和初始化OCI环境
首先要在源程序中包含OCI头文件:#include 
OCI环境即OCI函数的工作环境,在调用其他函数之前必须先调用OCIInitialize()和OCIEnvInit()函数创建和初始化OCI环境,其他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_envhp, 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.h头文件。
3.2申请句柄
句柄是指向OCI库所分配的内存区域的指针,该内存区域中的数据由OCI库维护,应用程序可通过句柄访问其中的数据。下面是应用程序中最常用的几个句柄:
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 **) 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()函数来读取、设置句柄属性。
3.3连接服务器建立会话
首先调用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_szPassword), (text*)m_szDbName, strlen(m_szDbName));建立数据库会话。此函数隐含申请服务器句柄和用户会话句柄,登录后,句柄是只读的,不能再设置句柄属性。
3.4执行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, &defnp0, m_errhp, 1, (dvoid *)szUSERNAME, 100, SQLT_STR, 
(dvoid *) 0, (ub2 *)0, (ub2 *)0, OCI_DEFAULT); //绑定变量
OCIStmtExecute( m_svchp, m_stmthp, m_errhp, (ub4) 1, (ub4) 0, (OCISnapshot *) NULL,
(OCISnapshot *) NULL, (ub4) OCI_DEFAULT); //执行SQL语句
3.5结束会话断开数据库连接
OCILogoff( m_svchp, m_errhp );
3.6断开与数据源的连接,释放句柄
OCIServerDetach( m_srvhp, m_errhp, OCI_DEFAULT ); //断开与数据源的连接
OCIHandleFree((dvoid *) m_stmthp, OCI_HTYPE_STMT); //释放句柄
OCIHandleFree((dvoid *) m_svchp, OCI_HTYPE_SVCCTX);
OCIHandleFree((dvoid *) m_srvhp, OCI_HTYPE_SERVER);
OCIHandleFree((dvoid *) m_errhp, OCI_HTYPE_ERROR)
3.7生成可执行文件(两种方法
(1)同普通的C程序:
#gcc -o exampled –I. –I$(ORACLE_HOME)/precomp/public example.c
(2)利用Oracle自带的Make文件:
首先将$ORACLE_HOME/rdbms/demo/demo_rdbms.mk文件copy到OCI源程序所在的目录,将源文件编译为目标文件:#gcc –c example.o -I$(ORACLE_HOME)/rdbms/demo 
-I$(ORACLE_HOME)/network/public -I$(ORACLE_HOME)/rdbms/public/ example.c
然后用命令:#make -f demo_rdbms.mk build OBJS=example.o EXE=exampled,exampled就为生成的可执行文件。
4 二者的比较
PRO*C程序的最大优点是简单易学,另外,因为PRO*C程序是把SQL语句翻译成相应的Oracle库函数调用,因此大大提高了应用程序的执行速度。
OCI程序使开发人员能使用已熟悉的C语言编程技术,通过Oracle的OCI函数调用快速开发应用程序,能充分发挥C语言的特点,使开发人员对程序设计和运行控制更加灵活,开发的应用程序具有更强的数据处理能力和更大的灵活性。
5 结束语
文章从开发环境、开发流程、编译三个方面分别详细分析了PRO*C和OCI程序设计的方法,并对两者的性能进行了比较。希望能为广大的计算机技术工作者提供参考。由于OCI程序设计相对复杂,以上所述仅是用来实现基本的数据库操作,若要实现更复杂的应用,需要做大量的实践操作,积累经验。文中举例的程序,都是在实际中编译通过了的,更有说服力。 
参考文献
[1]袁鹏飞著.Oracle数据库8i高级应用开发技术,人民邮电出版社,2000.7
[2]http://www.oradb.net/book.htm/Oracle ProC程序设计
[3] http://www.pgsqldb.org/pgsqldoc-cvs/index.html
[4]http://www.orafaq.com转贴

论文指导 开题报告   论文格式   论文撰写   论文答辩   论文答谢   
经济论文 税收论文   证券投资论文   房地产论文   金融论文   投资论文   财政论文   西经论文   国际贸易论文   计量经济论文   国民经济论文   保险信托论文   地方经济   国际经济   新经济学   经济学理论   经济学其他   
理工论文 计算机与信息技术论文   电子通信网络论文   自动化论文   土建水利论文   交通运输论文   化学与化工论文   石油与能源动力论文   机械制造论文   矿业与冶金论文   工程论文   生命环境论文   材料科学与工程   综合论文   
管理论文 电子商务论文   会计论文   财务论文   人力资源论文   市场营销论文   企业管理论文   信息管理论文   旅游管理论文   工商管理论文   公共管理论文   物流管理论文   
法律论文 民法论文   刑法论文   诉讼法论文   行政法论文   国家法   宪法论文   土地资源环境法论文   国际法论文   劳动保障论文   商法论文   经济法论文   法史学论文   法理学论文   司法制度论文   
行政论文 中国政治论文   国际政治论文   管理科学论文   思想政治教育论文   国家行政管理论文   政治理论论文   哲学理论论文   三个代表论文   社工论文   
英语论文 学术英语论文   商务英语论文   科技英语论文   英语教学论文   
艺术论文 艺术理论论文   电视艺术论文   电影艺术论文   音乐论文   舞蹈论文   戏剧论文   美术论文   
农学论文 农艺学(园林,林学)论文   渔业论文   水产论文   植物保护论文   农业基础科学论文   综合论文   
医学论文 医学论文写作方法   基础医学论文   医药卫生论文   临床医学论文   药学论文   特种医学论文   护理学论文   
文史论文 中国史论文   世界史论文   考古论文   文字学论文   语法论文   中国文学论文   世界文学论文   文学理论论文   文艺美学论文   文学评论论文   经典名著赏析论文   新闻传媒学论文   社会学论文   
教育教学论文 语文论文   数学论文   英语论文   物理论文   美术论文   音乐论文   地理论文   化学论文   历史论文   体育论文   思想政治论文   生物自然论文   信息技术论文   德育管理论文   素质教育论文   教学管理论文   综合论文   
[ ] [返回上一页] [打 印] [收 藏]
上一篇文章:加快基础测绘步伐,构建数字武汉空间数据基础框架
下一篇文章:用RMI开发基于Java的企业分布式应用
∷相关文章评论∷    (评论内容只代表网友观点,与本站立场无关!) [更多评论…]
设为首页 | 加入收藏 | 联系站长 | 友情链接 | 版权申明 |
服务电话:020-61131011;020-61131022 转82 投诉电话:020-61131011;020-61131022 转88 传真:020-61131022
电子邮件:paperease@vip.163.com paper@126.com 服务QQ:130008818 130009919
© 2002-2004 轻松论文网 赣ICP备05004673号 网络实名:轻松论文