日期:2014-05-16 浏览次数:20595 次
一 Pro*C 程序概述: 
  1.什么是Pro*C程序 
      在ORACLE数据库管理和系统中, 有三种访问数据库的方法; 
  (1) 用SQL*Plus, 它有SQL命令以交互的应用程序访问数据库; 
  (2) 用第四代语言应用开发工具开发的应用程序访问数据库,这些工具有SQL*Froms,QL*Reportwriter,SQL*Menu等; 
  (3) 利用在第三代语言内嵌入的SQL语言或ORACLE库函数调用来访问。 
  Pro*C就属于第三种开发工具之一, 它把过程化语言C和非过程化语言SQL最完善地结合起来, 具有完备的过程处理能力,又能完成任何数据库的处理品任务,使用户可以通过编程完成各种类型的报表。在Pro*C程序中可以嵌入SQL语言, 利用这些SQL语言可以完成动态地建立、修改和删除数据库中的表,也可以查询、插入、修改和删除数据库表中的行, 还可以实现事务的提交和回滚。 
    在Pro*C程序中还可以嵌入PL/SQL块, 以改进应用程序的性能, 特别是在网络环境下,可以减少网络传输和处理的总开销。 
    
  2.Pro*C的程序结构图 
    通俗来说,Pro*C程序实际是内嵌有SQL语句或PL/SQL块的C程序, 因此它的组成很类似C程序。 但因为它内嵌有SQL语句或PL/SQL块, 所以它还含有与之不同的成份。为了让大家对Pro*C有个感性的认识, 特将二者差别比较如下: 
?
二.Pro*C程序的组成结构 
   
  每一个Pro*C程序都包括两部分:(1)应用程序首部;(2)应用程序体 
  应用程序首部定义了ORACLE数据库的有关变量, 为在C语言中操纵ORACLE数据库做好了准备。应用程序体基本上由Pro*C的SQL语句调用组成。主要指查询SELECT、INSERT、UPDATE、DELETE等语句。 
  应用程序的组成结构如图所示: 

    
  1. 应用程序首部 
  应用程序的首部就是Pro*C的开始部分。它包括以下三部分: 
  l C变量描述部分; 
  l SQL变量描述部分(DECLARE部分); 
  l SQL通信区。 
   
  (1) .DECLARE部分(描述部分) 
  描述部分说明程序的SQL变量, 定义部分以EXEC SQL BEGIN DECLARE SECTION ;开始和以 EXEC SQL END DECLARE SECTION ;结束的。它可以出现在程序的主部,也可出现在局部 
  l SQL变量的说明和使用 
  在说明段能为SQL变量指定的数据类型如表所示: 
    
   这些数据类型实际上就是C语言的数据类型, 其中VARCHAR中视为C数据类型的扩充。这在以后会谈到。 
  SQL变量的使用应注意以下几点: 
  l 必须在描述部分明确定义 
  l 必须使用与其定义相同的大小写格式 
  l 在SQL语句中使用时,必须在其之前加一个“:”(冒号),但在C语句中引用时不需加冒号。 
  l 不能是SQL命令中的保留字。 
  l 可以带指示变量。 
  例如:EXEC SQL BEGIN DECLARE SECTIONS; 
      VARCHAR programe[30]; 
      Int porgsal, pempno; 
   EXEC SQL END DECLARE SECTION; 
       
   EXEC SQL SELECT ENAME , SAL 
   INTO: programe, : progsal 
   FROM EMP 
   WHERE EMPNO = : pempno; 
   
    (2). 指示器变量的说明和引用 
  指示变量实际上也是一类SQL变量,它被用来管理与其相关联的宿主变量(即在SQL语句中充 当输入或输出的变量)。每一个宿主变量都可定义一个指示器变量,主要用于处理空值(NULL) 
  指示器变量的说明基本同一般SQL变量一样, 但必须定义成2字节的整型,如SHORT、INT。在SQL语句中引用时, 其前也应加“:”(冒号),而且必须附在其相关联的宿主变量之后,在C语句中,可独立使用。当指示器变量为-1时,表示空值。例如: 
  EXEC SQL BEGIN DECLARE SECTION ; 
   INT dept- number; 
   SHORT ind – num; 
   CHAR emp –name; 
  EXEC SQL END DECLARE SECTION ; 
   
  Scanf(“90d %s”, & dept- number , dept – name ); 
   If (dept – number ==0) 
   Ind – num = -1; 
   Else  
   Ind – num = 0; 
  EXEC SQL INSERT INTO DEPT (DEPTNO, DNAME) 
  VALUES(:dept – number : ind- num , :dept – name); 
  其中ind – num是dept – number 的指示器变量。当输入的dept – number 值是0时, 则向DEPT 表的DEPTNO列插入空值。 
  (3).指针SQL变量的说明和使用 
  指针SQL变量在引用前也必须在DECLARE 部分先说明。其说明格式同C语言。在SQL语句中引用时,指针名字前要加前缀“:”(冒号)而不加“*”(星号)。在C语句中用法如同C语言的指针变量。 
  (4).数组SQL变更的说明和引用 
  在SQL语句中引用数组时,只需写数组名(名字前加冒号), 不需写下标,在C语句中用法如同C语言的数组变量。 
  使用数组可大大降低网络传输开销。如要向一表插入100行数据,如果没有数组,就要重复100次, 而引用后,只须执行一次insert语句、便可一次性插入。例如: 
    EXEC SQL BEGIN DECLARE SECTION; 
     Int emp_number[100]; 
     Char emp_name[100][15]; 
     Float salary[100],commission[100]; 
     Int dept_number; 
     EXEC SQL END DECLARE SECTION; 
   …. 
     EXEC SQL SELECT EMPNO,ENAME,SAL,COMM 
      INTO :emp_number,:emp_name,:salary,:commission 
     FROM EMP 
     WHERE DEPTNO=:dept_number; 
   在使用数组时,应注意以下几点; 
  l 不支持指针数组 
  l 只支持一维数组, 而 emp-name [100][15]视为一维字符串 
  l 数组最大维数为32767 
  l 在一条SQL语句中引用多个数组时,这些数组维数应相同 
  l 在VALUES , SET, INTO 或WHERE子名中, 不允许把简单SQL变量与数组SQL变量混用 
  l 不能在DELARE部分初始化数组 
  例如:下面的引用是非法的 
   EXEC SQL BEGIN DECLARE SECTION; 
   Int dept – num [3] = {10,20,30}; 
   EXEC SQL END DECLARE SECTION ; 
    
    EXEC SQL SELECT EMPNO, ENAME , SAL 
    INTO : emp – num [ i ], : emp – name [ i ], : salarg [ i ] 
    FROM EMP 
    (5) 伪类型VARCHAR的说明和引用 
    VARCHAR变量在引用之前也必须在说明段说明, 说明时必须指出串的最大         
  长度,如: 
       EXEC SQL BEGIN DECLARE SECTION;