Pro*c

Pro*C是Oracle提供的一种将C语言与SQL结合的开发工具,允许在C程序中嵌入SQL语句,实现高效的数据访问。它通过在C程序中声明SQL变量并使用通信区进行数据库交互,支持动态创建、修改和删除表,以及事务处理。Pro*C程序包含应用程序首部(定义ORACLE变量)和应用程序体(包含SQL语句和C语言控制结构)。在使用时,需注意SQL变量的声明、指示器变量的使用、指针SQL变量、数组SQL变量以及VARCHAR变量的处理。此外,Pro*C还支持游标来处理多行查询,通过声明、打开、关闭和获取数据的步骤操作游标。错误处理通常通过检查SQLCA结构体的状态码进行。
摘要由CSDN通过智能技术生成

一 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等语句。
应用程序的组成结构如图所示: 
EXEC SQL BEGIN DECLARE SECTION (SQL变量的定义)EXECSQL 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变量指定的数据类型如表所示:
数据类型 描述
CHARCHAR(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] = ;
EXEC SQL END DECLARE SECTION ;EXEC SQL SELECTEMPNO, 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;
此部分提供了用户运行程序的成败记录和错误处理。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 sql

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值