指示变量

指示变量是与DECLARE段中定义的宿主变量一一对应的任选变量(特殊的宿主变量), 它的作用在esql*C程序基本结构章应用程序声明部分中的指示变量小节中说明。

一个指示变量必须符合如下准则:

必须在DECLARE段中明确说明;

必须先说明后使用;

必须说明为数值类型

在SQL语句中使用时必须以冒号(:)作前缀;

在C语句中使用时不得以(:)作前缀;

不得与SQL保留字同名;

在SQL语句中必须有与其相关的宿主变量作前缀;

指示量的值为-1表示空值;

下面我们给出使用指示变量的实例:

例 4-1

/***************************************************************************************************************
esql*C 使用指示变量实例
***************************************************************************************************************/
#include <stdio.h>
#include <stdlib.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 GOTO not_found;

	/* 声明宿主变量*/
	EXEC SQL BEGIN DECLARE SECTION;
	char hnum[4]; /*最后一个字节是'\\0'*/
	char hname[21];
	char hcity[16];
	int hgrade;
	int city_ind; /* 跟宿主变量city相对应的indicator变量*/
	EXEC SQL END DECLARE SECTION;
	long SQLCODE;
	
	/* 连接神通数据库 */
	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('E1','艾黎',10,'北京');
	if (SQLCODE == 0)
	{
		printf("向表employee插入数据empnum: E1, empname: 艾黎, grade: 10, city: 北京          成功!\n");
	}
	/*获取指定行的信息*/

	strcpy(hnum ,"E1");
	EXEC SQL SELECT empname, grade, city \
	INTO :hname, :hgrade, :hcity:city_ind \
	FROM employee \
	WHERE empnum = :hnum;
	printf("查询数据 empnum:%s,empname :%s, grade:%d, city:%s\n",
	hnum, hname, hgrade, (city_ind==-1)?"null":hcity);
	
	EXEC SQL DROP TABLE employee;
	EXEC SQL COMMIT WORK;
	EXEC SQL DISCONNECT;
	exit(0);
	
	not_found:
		printf("员工 %s 不存在.\n", hnum);
		EXEC SQL DROP TABLE employee;
		EXEC SQL ROLLBACK WORK;
		EXEC SQL DISCONNECT;
		exit(1);
}