浅析Oracle数据库中Pro*C程序

来源 :电脑知识与技术 | 被引量 : 0次 | 上传用户:ilovegigi
下载到本地 , 更方便阅读
声明 : 本文档内容版权归属内容提供方 , 如果您对本文有版权争议 , 可与客服联系进行内容授权或下架
论文部分内容阅读
  摘要:本文深入浅出地阐述了C语言连接和处理Oracle数据库系统的Pro*C程序,结合作者实践经验,举例说明如何编写、编译和运行Pro*C程序。
  关键词:Oracle数据库;Pro*C程序;嵌入式SQL
  中图分类号:TP311.13 文献标识码:A文章编号:1009-3044(2007)15-30622-02
  Briefly Bewrite the Pro*C Program in the Oracle Database
  YU Qiu-ming
  (Jiangxi University of Science and Technology, Nanchang 330013, China)
  Abstract:This article elaboratedthe Pro*Cprogramabout the C language conjunction and process Oracle database system.Combining author’s practices experience, illustrating with example how to edit, compile and run thePro *C program
  Key words:Oracle database;Pro*C program;embedded SQL
  
  1 引言
  
  Oracle关系型数据库管理系统是数据库厂商Oracle(甲骨文)推出的当今世界上最流行的数据库,又是一个极其强大、灵活和复杂的系统.
  C语言是国际上广泛流行的计算机高级语言,既可以用来写系统软件,也可以用来写应用软件。现已成为世界上应用最为广泛的几种计算机语言之一。
  鉴于当前介绍Pro*C程序少之又少而单独介绍Oracle数据库或C语言的书籍非常多,本文将结合作者C语言的Oracle编程实践经验,简要剖析Pro*C程序的特点及如何编写Pro*C程序。
  
  2 Pro*C程序
  
  2.1 什么是Pro*C程序
  在Oracle数据库管理和系统中, Pro*C程序把过程化语言C和非过程化语言SQL最完善地结合起来, 具有完备的过程处理能力,又能完成任何数据库的处理品任务,使用户可以通过编程完成各种类型的报表。在Pro*C程序中可以嵌入SQL语言, 利用这些SQL语言可以完成动态地建立、修改和删除数据库中的表,也可以查询、插入、修改和删除数据库表中的行, 还可以实现事务的提交和回滚。在Pro*C程序中还可以嵌入PL/SQL块(Oracle公司在标准SQL语言的基础上发展起来专用于Oracle数据库程序设计的语言), 以改进应用程序的性能。
  2.2 Pro*C程序剖析
  Pro*C程序的组成结构
  每一个Pro*C程序都包括两部分:(1)应用程序首部;(2)应用程序体
  应用程序首部定义了Oracle数据库的有关变量,为在C语言中操纵Oracle数据做好了准备。应用程序体基本上由Pro*C的SQL语句调用组成。主要指查询SELECT、INSERT、UPDATE、DELETE等语句。
  2.2.1 应用程序首部
  应用程序的首部就是Pro*C的开始部分。它包括以下三部分:
  C变量描述部分;
  SQL变量描述部分(DECLARE部分);
  SQL通信区。
  描述部分说明程序的SQL变量及C变量, 定义部分以EXEC SQL BEGIN DECLARE SECTION 开始和以 EXEC SQL END DECLARE SECTION 结束。
  例如:
  EXEC SQL BEGIN DECLARE SECTION;
  char*uid=“scott/tiger”; /*C语言变量描述,字符指针uid*/
  SQL_CURSOR generic_cv:/*游标变量,属于SQL变量描述*/
  inttable_num;/*C语言变量描述,整型变量定义*/
  EXEC SQL END DECLARE SECTION;
  SQL通信区是用下列语句描述的:
  EXEC SQL INCLUDE SQLCA;
  此部分提供了用户运行程序的成败记录和错误处理.
  SQLCA的组成
  SQLCA是一个结构类型的变量,它是Oracle和应用程序的一个接口。在执行 Pro*C程序时, Oracle 把每一个嵌入SQL语句执行的状态信息存入SQLCA中, 根据这些信息,可判断SQL语句的执行是否成功,处理的行数,错误信息等,其组成如表所示:
  Struct sqlca
  {char sqlcaid [ 8 ] ; ----标识通讯区
  long sqlabc; ---通讯区的长度
  long sqlcode; ---保留最近执行的SQL语句的状态码
  struct{unsigned short sqlerrml; -----信息文本长度
  } sqlerrm;
  char sqlerrp[8];
  long sqlerrd[6];
  char sqlwarn[8];
  char sqlext[8]; }
  struct sqlca sqlca;
  其中, sqlcode在程序中最常用到,它保留了最近执行的SQL语句的状态码。程序员根据这些状态码做出相应的处理。这些状态码值如下:
  0: 表示该SQL语句被正确执行,没有发生错误和例外。
  >0:ORACLE执行了该语句,但遇到一个例外(如没找到任何数据)。
  <0:表示由于数据库、系统、网络或应用程序的错误,ORACLE未执行该SQL语句。
  当出现此类错误时,当前事务一般应回滚。
  2.2.2 应用程序体
  在Pro*C程序中, 可以把SQL语句和C语句自由地混合书写,并能在SQL语句中使用SQL变量,嵌入式SQL语句的书写语法是:
  以关键字EXEC SQL开始, 以C语言的语句终结符(分号)终结
  SQL语句的作用主要用于同数据库打交道。C语言程序用于控制,输入,输出和数据处理等。在Pro*C程序中常用的内嵌的SQL语句有:
  连接到Oracle数据库,语法如下:
  EXEC SQL CONNECT:< 用户名 > IDENTIFIED BY : < 口令 >
  或EXEC SQL CONNECT: < 用户名 > / < 口令 >
  在使用上述两种格式进行登入时, 应当首先在说明段定义包含用户名和口令的 SQL 变量,并在执行CONNECT之前设置它们,否则会造成登录失败。不能把用户名和口令直接编写到CONNECT语句中,或者把用引号(’)括起来的字母串在CONNECT 语句中, 如下面的语句是无效的。
  EXEC SQL CONNECT SCOTT INENTIFIED BY TIGER;
  EXEC SQL CONNECT ‘SCOTT’ IDENTIFIED BY ‘TIGER‘;
  SQL插入、更新和删除
  SQL数据库查询及游标的使用
  PL/SQL程序块
  以上三种在Oracle或其他数据库SQL中有详细介绍,在此不再说明。
  2.3 Pro*C程序的编写
  下面我们举一个例子说明如何编写Pro*C程序,该程序提示用户选择数据库,打开游标变量,提取查询返回行。
  /*声明Pro*C应用程序首部*/
  char temp[32];
  EXEC SQL BEGIN DECLARE SECTION;
  char *uid="scott/tiger";/*用户名和密码事先存放于某个变量中*/
  SQL_CURSOR generic_cv;/*游标变量*/
  int table_num;
  用C语言定义一个结构体变量emp_rec 用来存储scott方案下EMP数据表中数据
  用C语言定义一个结构体变量dept_rec用来存储scott方案下DEPT数据表中数据
  用C语言定义一个结构体变量bonus_rec用来存储scott方案下BONUS数据表中数据
  EXEC SQL END DECLARE SECTION;/*到此结束Pro*C应用程序首部,*/
  /*Pro*C应用程序体部分*/
  EXEC SQL WHENEVER SQLERROR DO sql_error();/*处理Oracle错误*/
  EXEC SQL CONNECT:uid;/*连接Oracle*/
  EXEC SQL ALLOCATE:generic_cv /*初始化游标变量*/
  EXEC SQL WHENEVER NOT FOUND DO break; /*当取完后退出*/
  for(;;)
  {printf("\n 1=EMP, 2=DEPT, 3=BONUS");
   printf("\n Enter table number(0 to quit):");
   gets(temp);
   table_num=atoi(temp);
   if(table_num<=0) break;
   EXEC SQL EXECUTE/*打开游标变量*/
   BEGIN
   IF :table_num=1 THEN
   OPEN :generic_cv FOR SELECT * FROM emp;
   ELSIF:table_num=2 THEN
   OPEN :generic_cv FOR SELECT * FROM dept;
   ELSIF:table_num=3 THEN
   OPEN :generic_cv FOR SELECT * FROM bonus;
   END IF;
   END;
   END-EXEC;
   for(;;) /*有选择地提取游标中数据到C语言结构体变量中*/
   {switch(table_num)
  {case 1: EXEC SQL FETCH:generic_cv INTO :emp_rec; break;
   case 2: EXEC SQL FETCH:generic_cv INTO :dept_rec;break;
   case 3: EXEC SQL FETCH:generic_cv INTO :bonus_rec;break;} }
   EXEC SQL CLOSE :generic_cv;/*关闭游标*/
   exit(0);
  void sql_error()
  {/*处理SQL错误* / }
  2.4 Pro*C程序的编译和运行
  Pro*C程序的编译和运行按照如下步骤进行:
  (1)先用Oracle Pro*C/C++预编译器对编制好的Pro*C程序进行预处理,该编译器将源程序中嵌入的SQL语言翻译成C语言,产生一个能被C语言编译器直接编译的文件。生成文件的扩展名为.c;
  (2)用C语言编译器对经Oracle预编译器预处理为扩展名为.c的文件编译,产生目标代码文件,其扩展名.obj;
  (3)使用MAKE命令,连接目标代码文件以及数据库,生成C语言可运行文件。
  为了加深理解,我们以图1来说明。
  图1
  
  3 结束语
  
  本文通过分析Pro*C的程序体系结构,我们发现与纯粹的C语言程序比较在数据说明方面多一些SQL变量的声明,在程序体处理方面多了一些嵌入的SQL语句,如连接,查询,数据操纵等,如此,C语言可以像处理自定义的普通数据变量一样来处理大型数据库Oracle内的数据。
  
  参考文献:
  [1]谭浩强.C语言程序设计[M].北京:北京大学出版社,2000,6.
  [2]赵松涛.Oracle9i中文版入门与提高[M].北京:人民邮电出版社,2002,7.
  [3]飞思科技产品研发中心.Oracle基础与提高[M].北京:电子工业出版社,2003.
  注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
其他文献
摘要:为了更好地、灵活的开发数据库应用软件,我们需要深入的研究ADO.NET的数据库访问机制,理解ADO.NET数据库的连接方法、对数据的操作与访问。ADO.NET添加了许多新的对象,如Dataset、DataReader、DataAdapter等,使得对数据库的操作更加简单。本文通过对ADO.NET数据交换原理、数据访问对象模型的使用,介绍了使用ADO.NET方法的数据库访问技术。  关键词:A
期刊
摘要: ASP. NET作为微软的.NET构架中的一部分,业已成为开发新型电子商务系统安全解决方案的主流开发工具。主要讨论了与ASP相比,ASP.NET的优势,注入式攻击问题以及实现 ASP. NET应用程序级别安全性的策略和解决方案。  关键词:.NET;ASP;安全;注入式攻击  中图分类号: TP393文献标识码: A文章编号:1009-3044(2007)15-30676-03  The
期刊
摘要:随着企业网、校园网及宽带网的迅速发展,基于三层交换与路由技术的交换机的应用已从最初网络中心骨干层、汇聚层渗透到接入层。本文对三层交换和路由技术、VLAN技术的应用进行了全面介绍,并对基于CISCO交换机的局域网VLAN配量进行了详尽描述。  关键词:VLAN;第三层交换;路由器;交换技术  中图分类号:TP393文献标识码:A文章编号:1009-3044(2007)15-30657-03  
期刊
摘要:中国加入WTO以后,烟草工业企业面对市场的压力越来越大,推进服务营销尤为重要。然而,在Internet时代客户比以前有了更多的选择,而且只需轻轻点击鼠标就可以贴近你或离你而去。因此,对于企业来说仅仅满足客户的需求已远远不够,更重要的是如何能让服务给客户留下深刻的印象。CSS作为一种前景广阔的企业解决方案,也越来越多地显示出其在以客户服务为中心的时代无可替代的重要地位。  关键词:烟草行业;.
期刊
摘要:TCP/IP协议现在用得非常广泛,但它本身也有一些安全上的缺陷。描述了各种各样针对这些缺陷的攻击,包括序列号攻击,SYN Flood攻击。提出了一些对这些攻击的防御方法。  关键词:TCP协议;网络安全;协议攻击;安全防御  中图分类号:TP393 文献标识码: A 文章编号:1009-3044(2007)15-30682-01  Security Problems Study in the
期刊
摘要:通过叙述ASP连接Access或Sql Server数据库的几种方式,来分析访问Access和SQL Server两种Web数据库的安全机制。  关键词:ASP;Web数据库;安全机制  中图分类号:TP309文献标识码:A文章编号:1009-3044(2007)15-30621-01  Safety Mechanism of Web Database Based on ASP  XU We
期刊
摘要:随着数据库应用系统中数据的增加,系统的响应速度成为系统设计中需要解决的主要问题。由于用户对数据库的要求越来越高,因此必须对数据库进行优化。系统优化的一个很重要的方面就是SQL语句本身的优化,文章从应用的角度论述了SQL语句优化的一些方法。  关键词:数据库;优化;SQL  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)15-30611-03  Analysis
期刊
摘要:为了最大限度的实现教学资源共享和提高学校网络资源的有效利用率,配合一套功能完整且实用、维护简便、安全性高记费管理系统,提高机房管理效率,降低工作强度,并及时处理机房发生的故障。本文针对Windows NT系统下域控制管理器的特点,设计了一种对帐号的计费/解锁/加锁等操作的方案。  关键词:NT机房计费系统;NT事件日志;SQL Server  中图分类号:TP315文献标识码:A文章编号:1
期刊
摘要:仓库管理系统是典型的信息管理系统(MIS), 其开发主要包括后台数据库的建立和维护,以及前端Web应用程序的开发两个方面。它使用VISUAL BASIC作为开发工具,同时用Microsoft Access 2003建立后台数据库,最后以JET数据库引擎技术实现前台界面与后台的连接。仓库管理系统主要完成仓库货物信息的录入、查询、统计和数据备份等功能,具有极强的实用性。  关键词:信息管理系统;
期刊
摘要:本文讨论了上海党建信息系统的体系结构,在该系统中,数据交换平台是其核心部分,如何保证数据的传输安全,保证数据完整、不可篡改以及不可否认等至关重要,文中提出了基于PKI技术的系统安全解决方案和并已基本实现。  关键词:PKI;CA;非对称加密;对称加密  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)15-30633-03  Data Security Polic
期刊