ESQL 资料(完全版)(3)

2019-04-08 19:07

CS_CHAR name; CS_INT value, test;

CS_CHAR server_1[BUFSIZ]; CS_CHAR server_2[BUFSIZ]; exec sql end declare section; ...

strcpy (server_1, sybase1); strcpy (server_2, sybase2); strcpy(user, my_id); strcpy(passwd, mypass);

exec sql connect :user identified by :passwd at connection_2 using :server_2;

exec sql connect :user identified by :passwd using :server_1;

/* 下面这个语句使用了server_1的连接*/ exec sql select royalty into :value from authors where author = :name; if (value == test) {

/* 下面这个语句使用了connection_2连接 */ exec sql at connection_2 update authors set column = :value*2 where author = :name;

在嵌入SQL语句中,使用DISCONNECT语句断开数据库的连接。其语法为: DISCONNECT [connection_name | ALL | CURRENT]

其中,connection_name为连接名。ALL表示断开所有的连接。CURRENT表示断开当前连接。断开连接会回滚当前事务、删除临时表、关闭游标和释放锁等。 2.3.3 数据的查询和修改

可以使用SELECT INTO语句查询数据,并将数据存放在主变量中。如:查询lastname为stringer的firstname信息。

EXEC SQL SELECT au_fname INTO :first_name from authors where au_lname = stringer;

使用DELETE语句删除数据。其语法类似于Transact-SQL中的DELETE语法。如: EXEC SQL DELETE FROM authors WHERE au_lname = White

使用UPDATE语句可以更新数据。其语法类似Transact-SQL中的UPDATE语法。如: ` EXEC SQL UPDATE authors SET au_fname = Fred WHERE au_lname = White 使用INSERT语句可以插入新数据。其语法就是Transact-SQL中的INSERT语法。如: EXEC SQL INSERT INTO homesales (seller_name, sale_price) real_estate(Jane Doe, 180000.00);

多行数据的查询和修改请参见下一节——游标。 2.3.4 游标的使用

用嵌入式SQL语句查询数据分成两类情况。一类是单行结果,一类是多行结果。对于单行结果,可以使用SELECT INTO语句;对于多行结果,你必须使用cursor(游标)来完成。游标(Cursor)是一个与SELECT

语句相关联的符号名,它使用户可逐行访问由SQL Server返回的结果集。先请看下面这个例子,这个例子的作用是逐行打印staff表的id、name、dept、 job、years、salary和comm的值。 ………..

EXEC SQL DECLARE C1 CURSOR FOR

SELECT id, name, dept, job, years, salary, comm FROM staff; EXEC SQL OPEN c1; while (SQLCODE == 0) {

/* SQLCODE will be zero if data is successfully fetched */

EXEC SQL FETCH c1 INTO :id, :name, :dept, :job, :years, :salary, :comm; if (SQLCODE == 0)

printf(M s d s - ? ?, id, name, dept, job, years, salary, comm); }

EXEC SQL CLOSE c1; ………

从上例看出,你首先应该定义游标结果集,即定义该游标的SELECT语句返回的行的集合。然后,使用FETCH语句逐行处理。

值得注意的是,嵌入SQL语句中的游标定义选项同Transact-SQL 中的游标定义选项有些不同。必须遵循嵌入SQL语句中的游标定义选项。 1)、声明游标:

如:EXEC SQL DECLARE C1 CURSOR FOR

SELECT id, name, dept, job, years, salary, comm FROM staff; 其中,C1是游标的名称。 2)、打开游标

如:EXEC SQL OPEN c1;

完整语法为:EXEC SQL OPEN 游标名 [USING 主变量名 | DESCRIPTOR 描述名]。关于动态OPEN游标的描述见第四节。 3)、取一行值

如:EXEC SQL FETCH c1 INTO :id, :name, :dept, :job, :years, :salary, :comm; 关于动态FETCH语句见第四小节。 4)、关闭游标

如:EXEC SQL CLOSE c1;

关闭游标的同时,会释放由游标添加的锁和放弃未处理的数据。在关闭游标前,该游标必须已经声明和打开。另外,程序终止时,系统会自动关闭所有打开的游标。

也可以使用UPDATE语句和DELETE语句来更新或删除由游标选择的当前行。使用DELETE语句删除当前游标所在的行数据的具体语法如下:

DELETE [FROM] {table_name | view_name} WHERE CURRENT OF cursor_name 其中,

ltable_name是表名,该表必须是DECLARE CURSOR中SELECT语句中的表。 lview_name是视图名,该视图必须是DECLARE CURSOR中SELECT语句中的视图。 lcursor_name是游标名。

请看下面这个例子,逐行显示firstname和lastname,询问用户是否删除该信息,如果回答―是‖,那么删除

当前行的数据。

EXEC SQL DECLARE c1 CURSOR FOR SELECT au_fname, au_lname FROM authors ; EXEC SQL OPEN c1; while (SQLCODE == 0) {

EXEC SQL FETCH c1 INTO :fname, :lname; if (SQLCODE == 0) {

printf(s s\\n, fname, lname); printf(Delete? ); scanf(%c, &reply); if (reply == y) {

EXEC SQL DELETE FROM authors WHERE CURRENT OF c1; printf(delete sqlcode= %d\\n, SQLCODE(ca)); } } }

EXEC SQL CLOSE c1; 2.3.5 SQLCA

DBMS是通过SQLCA(SQL通信区)向应用程序报告运行错误信息。SQLCA是一个含有错误变量和状态指示符的数据结构。通过检查SQLCA,应用程序能够检查出嵌入式SQL语句是否成功,并根据成功与否决定是否继续往下执行。预编译器自动会在嵌入SQL语句中插入SQLCA数据结构。在程序中可以使用EXEC SQL INCLUDE SQLCA,目的是告诉SQL预编译程序在该程序中包含一个SQL通信区。也可以不写,系统会自动加上SQLCA结构。 下表是SQLCA结构中的变量和作用: 变量 数据类型 作用

sqlcaid char 包含―sqlca‖的字符串 sqlcabc long SQLCA的长度

sqlcode long 包含最近一次语句执行的返回代码 sqlwarn[0] 到

sqlwarn[7] char 警告标志。如果是―W‖,那么表示有警报信息。 sqlerrm.sqlerrmc[ ] char 错误信息。 sqlerrm.sqlerrml long 错误信息的长度。 sqlerrp char 检测错误或警告信息的过程。

sqlerrd[6] long 警告或错误的详细信息。[2]中存放影响行的个数。 下面仔细讲解几个重要的变量。 1)、SQLCODE

SQLCA结构中最重要的部分是SQLCODE变量。在执行每条嵌入式SQL语句时,DBMS在SQLCA中设置变量SQLCODE值,以指明语句的完成状态: 1、0该语句成功执行,无任何错误或报警。

2、<0 出现了严重错误。 3、>0 出现了报警信息。

4、100没有数据存在。在FETCH语句中,表示到达结果集的末尾。在UPDATE、 DELETE、INSERT语句中,表示没有满足条件的数据。 例:显示错误信息。

printf(\\nError occurred: code %d.\\n%s, 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语句之后自动生成错误处理程序,并指定了错误处理操作。

用户可以使用WHENEVER语句通知预编译程序去如何处理三种异常处理:

lWHENEVER SQLERROR action:表示一旦sql语句执行时遇到错误信息,则执行action,action中包含了处理错误的代码(SQLCODE<0)。

lWHENEVER SQLWARNING action:表示一旦sql语句执行时遇到警告信息,则执行aciton,即action中包含了处理警报的代码(SQLCODE=1)。

lWHENEVER NOT FOUND action:表示一旦sql语句执行时没有找到相应的元组,则执行action,即action包含了处理没有查到内容的代码(SQLCODE=100)。

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

lWHENEVER…CONTINUE:通知预编译程序让程序的控制流转入到下一个主语言语句。 lWHENEVER…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(SQL DELETE error: %ld\\n, sqlcode); exit(); errormessage2:

printf(SQL INSERT error: %ld\\n, sqlcode); exit();

WHENEVER语句是预编译程序的指示语句。在上面这个例子中,由于第一个WHENEVER语句的作用,前面两个DELETE语句中任一语句内的一个错误会在errormessage1中形成一个转移指令。由于一个WHENEVER语句替代前面WHENEVER语句,所以,嵌入式UPDATE语句中的一个错误会直接转入下一个程序语句中。嵌入式INSERT语句中的一个错误会在errormessage2中产生一条转移指定。 从上面例子看出,WHENEVER/CONTINUE语句的主要作用是取消先前的WHENEVER语句的作用。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模


ESQL 资料(完全版)(3).doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:施工组织设计5

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

马上注册会员

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