日期:2013-12-22  浏览次数:20410 次

一 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有个感性的认识, 特将二者差别比较如下:
C的全程变量说明
C源程序 函数1:同函数K。
函数2:同函数K。



C的局部变量说明
函数K
可执行语句

使用程序首部 C的外部变量说明
外部说明段(ORACLE变量说明)
通讯区说明

Pro*C源程序 函数1:同函数K。
函数2:同函数K。
C局部变量说明
程序体 内部说明部分 内部说明段
通讯区说明
函数K C的可执行语句
可执行语句 SQL的可执行语句

或PL/SQL块

二.Pro*C程序的组成结构

每一个Pro*C程序都包括两部分:(1)使用程序首部;(2)使用程序体
使用程序首部定义了ORACLE数据库的有关变量,
为在C言语中操纵ORACLE数据库做好了预备。使用程序体基本上由Pro*C的SQL语句调用组成。次要指查询SELECT、INSERT、UPDATE、DELETE等语句。
使用程序的组成结构如图所示:
使用程序首部
描述部分


SQL通信区

使用程序体
EXEC SQL BEGIN DECLARE SECTION
(SQL变量的定义)
EXEC SQL END DECLARE SECTION;
EXEC SQL INCLUDE SQLLA;
EXEC SQL CONNECT:< 用户名>
IDENTIFIED BY: < 口令 >
SQL 语句及游标的使用


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变量指定的数据类型如表所示:
数据类型描述
CHAR
CHAR(n)
INT
SHORT
LONG
FLOAT
DOUBLE
VARCHAR单字符
n个字符数组
整数
短整数
单精度浮点数
双精度浮点数
变长字符串

这些数据类型实际上就是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部分初始化数组
例如:下面的援用是非法的