每一个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; 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 ); book – name .len = strlen (book – name .arr); EXEC SQL UPDATE BOOK SET BNAME = : book – name ; BDESC = : book – number ; } (6) SQL通信区 SQL 通信区是用下列语句描述的: EXEC SQL INCLUDE SQLCA; 此部分提供了用户运行程序的成败记录和错误处理。