一 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部分初始化数组
例如:下面的引用是非法的
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;
int book – number;
varchar book – name [ 50 ];
exec sql end declare section ;
在预编绎时, book – name 被翻译成c语言中的一个结构变量;
struct { unsigned short len ;
unsigned chart arr [ 20 ] ;
} boo – name
由此看出, varchar变量实际上是含长度成员和数组成员的结构变量。在sql语句中引用时,应引用以冒号为前缀的结构名, 而不加下标,在c语句 中引用结构成员。
varchar变量在作输出变量时,由oracle自动设置, 在作为输入变量时,程序应先把字符串存入数组成员中,
其长度存入长度成员中,然后再在sql语句中引用。例如:
main( )
{ .......
scanf(“90s, 90d’, book – name .arr, & book – number );