编程实例¶
在本章的最后,我们给出了一个完整的使用游标的例子。
例 7-1
/***************************************************************************************************
esql*C使用游标的程序实例 *
***************************************************************************************************/
#include <stdio.h>
void error()
{
/*对错误情况不予处理,以防止死循环*/
EXEC SQL WHENEVER SQLERROR CONTINUE;
/* 输出错误信息*/
sqlprint();
EXEC SQL ROLLBACK WORK;
exit(1);
}
int main()
{
int n = 0;
long SQLCODE;
/* 定义宿主变量*/
EXEC SQL BEGIN DECLARE SECTION;
char hnum[4];
char hname[21];
EXEC SQL END DECLARE SECTION;
/* 错误情况处理*/
EXEC SQL WHENEVER SQLERROR do error() ;
/* 连接神通数据库 */
EXEC SQL CONNECT TO osrdb@localhost USER
sysdba USING szoscar55;
EXEC SQL WHENEVER SQLERROR CONTINUE;
/*建表之前先删除已经存在的表*/
EXEC SQL DROP TABLE employee;
EXEC SQL WHENEVER SQLERROR do error();
/* 创建表employee */
EXEC SQL CREATE TABLE employee(
empnum CHARACTER(3) PRIMARY KEY,
empname CHAR(20),
grade DECIMAL(4,0),
city VARCHAR(15));
if (SQLCODE == 0)
{
printf("表employee成功创建!\n");
}
EXEC SQL INSERT INTO employee VALUES('1','张三',10,'北京');
EXEC SQL INSERT INTO employee VALUES('2','李四',15,'天津');
EXEC SQL INSERT INTO employee VALUES('3','王五',28,'杭州');
EXEC SQL INSERT INTO employee VALUES('4','宋六',20,'上海');
EXEC SQL INSERT INTO employee VALUES('5','陆七',1,'南京');
EXEC SQL DECLARE cur_emp CURSOR FOR SELECT empnum, \
Empname FROM employee WHERE grade <20 ;
/* 打开游标*/
EXEC SQL OPEN cur_emp;
/* 找不到记录时从循环中退出(break)。*/
EXEC SQL WHENEVER NOT FOUND DO break;
while(1)
{
/* 取数据*/
EXEC SQL FETCH cur_emp INTO :hnum, :hname;
printf("员工信息#%d : %s , %s\n", n++, hnum, hname) ;
}
/* 对找不到记录的情况不予处理*/
EXEC SQL WHENEVER NOT FOUND CONTINUE;
/* 关闭游标,若此处未调用CLOSE语句关闭游标,那么在COMMIT时,系统会自动关闭它 */
EXEC SQL CLOSE cur_emp;
/* 操作正确时提交事务*/
EXEC SQL DROP TABLE employee;
EXEC SQL COMMIT WORK;
EXEC SQL DISCONNECT;
exit(0);
}