嵌入式SQL语言imp(4)

2019-04-22 08:33

下面仔细讲解几个重要的变量。 1)、SQLCODE

SQLCA结构中最重要的部分是SQLCODE变量。在执行每条嵌入式SQL语句时,DBMS在SQLCA中设置变量SQLCODE值,以指明语句的完成状态: 1、0 该语句成功执行,无任何错误或报警。 2、<0 出现了严重错误。 3、>0 出现了报警信息。 4、100 没有数据存在。在FETCH语句中,表示到达结果集的末尾。在UPDATE、 DELETE、INSERT语句中,表示没有满足条件的数据。 例:显示错误信息。

printf(\sqlca.sqlcode, sqlca.sqlerrm.sqlerrmc);

在SYBASE SQL SERVER中,也可以单独定义SQLCODE。如:

long SQLCODE;

exec sql open cursor pub_id; while (SQLCODE == 0) {

exec sql fetch pub_id into :pub_name; …..

2)、SQLSTATE

SQLSTATE变量也是SQLCA结构中的成员。它同SQLCODE一样,都是返回错误信息。SQLSTATE是在SQLCODE之后产生的。这是因为,在制定SQL2标准之前,各个数据库厂商都采用SQLCODE变量来报告嵌入式SQL语句中的错误状态。但是,各个厂商没有采用标准的错误描述信息和错误值来报告相同的错误状态。所以,标准化组织增加了SQLSTATE变量,规定了通过SQLSTATE变量报告错误状态和各个错误代码。因此,目前使用SQLCODE的程序仍然有效,但也可用标准的SQLSTATE错误代码编写新程序。值得注意的是,Open client emebeded SQL/C11.1.x并不完全支持SQLSTATE。

SQLSTATE是一个字符串参数。具体含义如下: 值 作用

00XXX 成功 01XXX 警告 02XXX 不存在数据 其他值 错误 2.3.6 WHENEVER

在每条嵌入式SQL语句之后立即编写一条检查SQLCODE/SQLSTATE值的程序,是一件很繁琐的事情。为了简化错误处理,可以使用WHENEVER语句。该语句是SQL预编译程序的指示语句,而不是可执行语句。它通知预编译程序在每条可执行嵌入式SQL语句之

16

后自动生成错误处理程序,并指定了错误处理操作。

用户可以使用WHENEVER语句通知预编译程序去如何处理三种异常处理: ? WHENEVER SQLERROR action:表示一旦sql语句执行时遇到错误信息,则执行action,

action中包含了处理错误的代码(SQLCODE<0)。

? WHENEVER SQLWARNING action:表示一旦sql语句执行时遇到警告信息,则执行

aciton,即action中包含了处理警报的代码(SQLCODE=1)。 ? WHENEVER NOT FOUND action:表示一旦sql语句执行时没有找到相应的元组,则执

行action,即action包含了处理没有查到内容的代码(SQLCODE=100)。

针对上述三种异常处理,用户可以指定预编译程序采取以下三种行为(action): ? WHENEVER …GOTO:通知预编译程序产生一条转移语句。

? WHENEVER…CONTINUE:通知预编译程序让程序的控制流转入到下一个主语言语

句。

? WHENEVER…CALL:通知预编译程序调用函数。 其完整语法如下:

WHENEVER {SQLWARNING | SQLERROR | NOT FOUND} {CONTINUE | GOTO stmt_label | CALL function()} 例:WHENEVER的作用

EXEC SQL WHENEVER sqlerror GOTO errormessage1; EXEC SQL DELETE FROM homesales WHERE equity < 10000;

EXEC SQL DELETE FROM customerlist WHERE salary < 40000;

EXEC SQL WHENEVER sqlerror CONTINUE; EXEC SQL UPDATE homesales SET equity = equity - loanvalue;

EXEC SQL WHENEVER sqlerror GOTO errormessage2;

EXEC SQL INSERT INTO homesales (seller_name, sale_price) real_estate('Jane Doe', 180000.00); . . . errormessage1:

printf(\exit();

errormessage2:

printf(\exit();

WHENEVER语句是预编译程序的指示语句。在上面这个例子中,由于第一个WHENEVER语句的作用,前面两个DELETE语句中任一语句内的一个错误会在errormessage1中形成一个转移指令。由于一个WHENEVER语句替代前面WHENEVER语句,所以,嵌入式UPDATE语句中的一个错误会直接转入下一个程序语句中。嵌入式INSERT语句中的一个错误会在errormessage2中产生一条转移指定。

从上面例子看出,WHENEVER/CONTINUE语句的主要作用是取消先前的WHENEVER

17

语句的作用。WHENEVER语句使得对嵌入式SQL错误的处理更加简便。应该在应用程序中普遍使用,而不是直接检查SQLCODE的值。

2.3.7 批处理

嵌入SQL也支持批处理。如:

exec sql insert into TABLE1 values (:val1) insert into TABLE2 values (:val2)

insert into TABLE3 values (:val3);

SYBASE SQL SERVER将在EXEC SQL和“;”之间的所有T-SQL语句作为一个批来处理。在上例中,会将这3个语句作为一组来处理。

2.3.8 事务

SYBASE SQL SERVER预编译器能够处理两种事务模式:ANSI/ISO事务模式和T-SQL模式。在T-SQL模式中,除非有begin transaction外,每个语句都会做提交。可以在编译时设置事务模式。ANSI/ISO模式是系统的缺省模式。嵌入SQL的事务语法和T-SQL的事务语法是相同的。

2.3.8.1 T-SQL事务模式

1)、开始事务

exec sql [at connect_name]

begin transaction [ transaction_name]; 2)、保存事务回滚点

exec sql [at connect_name]

save transaction [ savepoint_name]; 3)、提交事务

exec sql [at connect_name] commit transaction

[ transaction_name]; 4)、回滚事务

exec sql [at connect_name] rollback transaction

[ savepoint_name | transaction_name];

2.3.8.2 ANSI/ISO事务模式

该模式没有begin transaction和save transaction。在应用程序中,只要遇到以下语句,就表示事务开始:delete、insert、select、update、open和exec。当遇到commit work或rollback work,就表示事务结束。也就是说,commit和rollback表示当前事务结束,下一个事务开始。

2.4动态SQL语句

前一节中讲述的嵌入SQL语言都是静态SQL语言,即在编译时已经确定了引用的表和列。主变量不改变表和列信息。在上几节中,我们使用主变量改变查询参数,但是不能用主变量代替表名或列名。否则,系统报错。动态SQL语句就是来解决这个问题。

动态SQL语句的目的是,不是在编译时确定SQL的表和列,而是让程序在运行时提供,

18

并将SQL语句文本传给DBMS执行。静态SQL语句在编译时已经生成执行计划。而动态SQL语句,只有在执行时才产生执行计划。动态SQL语句首先执行PREPARE语句要求DBMS分析、确认和优化语句,并为其生成执行计划。DBMS还设置SQLCODE以表明语句中发现的错误。当程序执行完“PREPARE”语句后,就可以用EXECUTE语句执行执行计划,并设置SQLCODE,以表明完成状态。 使用动态SQL,共分成四种方法: 方法 支持的SQL语句 实现方法 1 该语句内不包含宿主变量,该语句不是查询语句 execute immediate 2 该语句内包含输入宿主变量 ,该语句不是查询语句 prepare和execute 3 包含已知数目的输入宿主变量或列的查询 prepare和fetch

4 包含未知数目的输入宿主变量或列的查询 prepare和fetch,用描述符 按照功能和处理上的划分,动态SQL应该分成两类来解释:动态修改和动态查询。方法1和方法2完成动态修改(参见2.4.1)。方法3和方法4完成了动态查询(参见2.4.2和2.4.3)。

2.4 .1 动态修改

方法1和方法2完成动态修改。对于方法1,表示要执行一个完整的T-SQL语句,该语句没有宿主变量,不是一个查询语句。因为没有宿主变量来带入不同的参数,所以不能通过方法1来重复执行修改语句。具体语法为:

exec sql [at connection_name] execute immediate

{: host_variable | string};

其中,host_variable和string是存放完整T-SQL语句。

例:提示用户输入被更新书的条件,然后组合成为一个完整的SQL语句,并执行更新。

exec sql begin declare section; CS_CHAR sqlstring[200]; exec sql end declare section; char cond[150];

exec sql whenever sqlerror call err_p(); exec sql whenever sqlwarning call warn_p(); strcpy(sqlstring,

\printf(\scanf(\strcat(sqlstring, cond);

exec sql execute immediate :sqlstring; exec sql commit work;

对于方法2,可以执行一个包含输入宿主变量的动态修改语句。该方法要使用PREPARE语句和EXECUTE语句。PREPARE语句是动态SQL语句独有的语句。其语法为:

PREPARE 语句名 FROM 宿主变量|字符串

该语句接收含有SQL语句串的宿主变量,并把该语句送到DBMS。DBMS编译语句并

19

生成执行计划。在语句串中包含一个“?”表明参数,当执行语句时,DBMS需要参数来替代这些“?”。PREPRARE执行的结果是,DBMS用语句名标志准备后的语句。SQL SERVER编译后的语句以临时存储过程的形式存放在缓冲区中。语句名类似于游标名,是一个SQL标识符。在执行SQL语句时,EXECUTE语句后面是这个语句名。请看下面这个例子: EXEC SQL BEGIN DECLARE SECTION;

char prep[] = \ALUES(?,?,?)\char name[30]; char car[30]; double num;

EXEC SQL END DECLARE SECTION;

EXEC SQL PREPARE prep_stat FROM :prep; while (SQLCODE == 0) {

strcpy(name, \ strcpy(car, \ num = 4.9;

EXEC SQL EXECUTE prep_stat USING :name, :car, :num; }

在这个例子中,prep_stat是语句名,prep宿主变量的值是一个INSERT语句,包含了三个参数(3个“?”)。PREPARE的作用是,DBMS编译这个语句并生成执行计划,并把语句名标志这个准备后的语句。值得注意的是,PREPARE中的语句名的作用范围为整个程序,所以不允许在同一个程序中使用相同的语句名在多个PREPARE语句中。 EXECUTE语句是动态SQL独有的语句。它的语法如下:

EXECUTE 语句名 USING 宿主变量 | DESCRIPTOR 描述符名

请看上面这个例子中的“EXEC SQL EXECUTE prep_stat USING :name, :car, :num;”语句,它的作用是,请求DBMS执行PREPARE语句准备好的语句。当要执行的动态语句中包含一个或多个参数标志时,在EXECUTE语句必须为每一个参数提供值,如::name、:car和:num。这样的话,EXECUTE语句用宿主变量值逐一代替准备语句中的参数标志(“?”),从而,为动态执行语句提供了输入值。

使用主变量提供值,USING子句中的主变量数必须同动态语句中的参数标志数一致,而且每一个主变量的数据类型必须同相应参数所需的数据类型相一致。各主变量也可以有一个伴随主变量的指示符变量。当处理EXECUTE语句时,如果指示符变量包含一个负值,就把NULL值赋予相应的参数标志。除了使用主变量为参数提供值,也可以通过SQLDA提供值(见节2.4.4)。

2.4.2 动态游标

使用动态游标可以完成方法3。 游标分为静态游标和动态游标两类。对于静态游标,在定义游标时就已经确定了完整的SELECT语句。在SELECT语句中可以包含主变量来接收输入值。当执行游标的OPEN语句时,主变量的值被放入SELECT语句。在OPEN语句中,不用指定主变量,因为在DECLARE CURSOR语句中已经放置了主变量。请看下面静态游标的例子: EXEC SQL BEGIN DECLARE SECTION; char szLastName[] = \

20


嵌入式SQL语言imp(4).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:苏教版六年级语文上册一课一练(整理)

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: