编程实例

在本章的最后,我们给出了一个完整的使用游标的例子。

例 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);
}