分享
 
 
 

ORACLE培训教程(4)-Pro*C的使用

王朝oracle·作者佚名  2008-05-19
窄屏简体版  字體: |||超大  

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的开始部分。它包括以下三部分:

lC变量描述部分;

lSQL变量描述部分(DECLARE部分);

lSQL通信区。

(1) .DECLARE部分(描述部分)

描述部分说明程序的SQL变量, 定义部分以EXEC SQL BEGIN DECLARE SECTION ;开始和以 EXEC SQL END DECLARE SECTION ;结束的。它可以出现在程序的主部,也可出现在局部

lSQL变量的说明和使用

在说明段能为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;

此部分提供了用户运行程序的成败记录和错误处理。

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 sqlca sqlca;

其中, sqlcode在程序中最常用到,它保留了最近执行的SQL语句的状态码。程序员根据这些状态码做出相应的处理。这些状态码值如下:

0: 表示该SQL语句被正确执行,没有发生错误和例外。

0:ORACLE执行了该语句,但遇到一个例外(如没找到任何数据)。

当出现此类错误时,当前事务一般应回滚。

2.应用程序体

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有