完整的例子

下面这个例子使用了建表、插入行、更新行、删除行的所有语句。如果把它作为一个简单的应用程序的话,那么使用它的用户对于SQL语句不需要有任何了解就可以使用该应用程序来进行简单的部门管理了。程序运行后,会先创建一个表department,包含deptno,deptname,leader,sal四列。根据执行结果,用户可以知道表创建是否成功,一般情况下,表创建都能够成功完成,除非用户没有创建表权限,或者表department已经在数据库sql92test中存在了。这两种情况一般不会发生,因为这是一个用于测试而新创建的数据库,而且用户oscar具有创建表的权限。

表创建成功后,向表中加入新部门,删除已存在部门,或者更新已存在部门的信息。

例 3-5

/*************************************************************************************************************
这个例子演示建表、插入、更新、删除操作
*************************************************************************************************************/
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>

void error()
{
	/*对错误情况不予处理,以防止死循环*/
	EXEC SQL WHENEVER SQLERROR CONTINUE;
	/*输出错误信息*/
	sqlprint();
	EXEC SQL ROLLBACK WORK;
	exit(1);
}

int main()
{
	/*对错误情况的处理*/
	EXEC SQL WHENEVER SQLERROR do error();
	/*如果没有找到,则打印信息,退出*/
	EXEC SQL WHENEVER NOT FOUND continue;
	/* 声明宿主变量*/
	EXEC SQL BEGIN DECLARE SECTION;
	int hnum;
	char hname[21];
	char hleader[21];
	float hsal;
	EXEC SQL END DECLARE SECTION;
	int num = 0;
	char item[7];
	long SQLCODE;

	/* 连接神通数据库*/
	EXEC SQL CONNECT TO osrdb@localhost
	USER sysdba USING szoscar55;
	printf("=================欢迎来到简单学院管理系统!=================\n");
	goto do_again;

	do_again:
	switch(num)
	{
		case 0:
			goto do_create;
		case 1:
			goto do_insert;
		case 2:
			goto do_update;
		case 3: 
			goto do_delete;
		default:
			goto do_exit;
	}

	do_create:
	EXEC SQL WHENEVER SQLERROR CONTINUE;
	EXEC SQL DROP TABLE department;
	EXEC SQL WHENEVER SQLERROR do error();
	printf("正在执行创建表department(deptno, deptname,leader, sal);\n");
	EXEC SQL CREATE TABLE department(
	deptno INT PRIMARY KEY,
	deptname CHAR(20),
	leader CHAR(20),
	sal FLOAT);
	if (SQLCODE == 0) 
	{
		printf("表department(deptno, deptname, leader, sal)成功创建!\n");
	}

	EXEC SQL DECLARE cur_dept CURSOR FOR SELECT * FROM department;
	if (SQLCODE < 0)
	{
	  printf("声明游标失败!\n");
	}
	num ++;
	goto do_again;

	do_insert:
	printf("正在向表department插入两条数据\n");
	EXEC SQL INSERT INTO department VALUES(1,'数据库产品本部','张三',15000);
	if (SQLCODE == 0)
	{
		printf("成功插入新元组一: %d, %s, %s, %d.\n", 1, "数据库产品本部", "张三", 15000);
	}

	EXEC SQL INSERT INTO department VALUES(2,'大数据应用本部','李四',20000);
	if (SQLCODE == 0)
	{
		printf("成功插入新元组二: %d, %s, %s, %d.\n", 2, "大数据应用本部", "李四", 20000);
	}
	goto do_select;

	do_update:
	printf("正在执行把表department中deptno = 1 的数据的sal值更新为18000\n");
	EXEC SQL UPDATE department SET sal = 18000 where deptno = 1;
	if (SQLCODE == 0)
	{
		printf("成功更新deptno = %d的工资!\n", 1);
	}
	goto do_select;

	do_delete:
	printf("正在执行删除操作:删除deptno = 2 的部门\n");
	EXEC SQL DELETE FROM department where deptno = 2;
	if (SQLCODE == 0)
	{
		printf("成功删除deptno = %d的部门.\n", 2);
	}
	goto do_select;

	do_select:
	printf("正在执行查询操作\n");
	EXEC SQL OPEN cur_dept;
	if (SQLCODE < 0)
	{
		printf("打开游标失败!\n");
	}
	printf("deptno\t\|deptname\t\t\|leader\t\t\t\|sal\n");
	printf("===============================================================================\n");
	while(1)
	{
		EXEC SQL FETCH cur_dept INTO :hnum, :hname, :hleader, :hsal; 
		if (SQLCODE != 0)
		{
			break;
		}
		printf("%d\t%s\t%s\t%2f\n", hnum, hname, hleader, hsal);
	}
	EXEC SQL CLOSE cur_dept;
	num ++;
	goto do_again;

	do_exit:
	EXEC SQL DROP TABLE department;
	EXEC SQL COMMIT WORK;
	EXEC SQL DISCONNECT;
	num = 0;
	exit(0);
}