DEALLOCATE DESCRIPTOR

释放ALLOCATE DESCRIPTOR 命令分配的用于存储SQL命令的结果信息的描述符。格式如下:

EXEC SQL DEALLOCATE DESCRIPTOR <描述标识符>;

使用如下:

EXEC SQL DEALLOCATE DESCRIPTOR desc_query;

这句话释放名为'desc_query'的描述符,也就是说如果不再次分配该描述符,那么对这个名字的访问将会出错。另外,也说明这个描述符名可以被再次分配使用。如果没有分配这个描述符或者用户用了错误的名字,那么系统会给出非法的描述符名这个错误信息,并设置相应的结果码和结果状态。

下面是一个使用描述符动态执行各种SQL命令的实例。源程序如下:

/********************************************************
* esql*C 使用DESCRIPTOR的实例*
********************************************************/
#include <stdio.h>
#include <stdlib.h>
void error()
{
	/* 对错误情况不予处理,以防止死循环*/
	EXEC SQL WHENEVER SQLERROR CONTINUE;
	/* 输出错误信息*/
	sqlprint();
	EXEC SQL ROLLBACK WORK;
	exit(1);
}
int main()
{
	/*声明宿主数组变量*/
	EXEC SQL BEGIN DECLARE SECTION;
	char query[80];
	int hindex, hcount;
	char hname[40];
	long hlength;
	char hdata[21];
	int hindicator;
	EXEC SQL END DECLARE SECTION;
	long SQLCODE;
	int rowcnt = 0;
	sprintf(query, "select * from v_sys_tables");
	/* 对错误情况进行处理 */
	EXEC SQL WHENEVER SQLERROR do error();
	/* 分配存放SQL命令信息的内存空间*/
	EXEC SQL ALLOCATE DESCRIPTOR desc_query;
	/* 连接神通数据库*/
	EXEC SQL CONNECT TO osrdb@localhost USER
	sysdba USING szoscar55;
	EXEC SQL PREPARE prep_query from :query;
	EXEC SQL DECLARE cur_query CURSOR FOR prep_query;
	EXEC SQL OPEN cur_query;
	/*下面的程序段将DESCRIPTOR中的信息取到宿主变量中*/
	while (1)
	{
		EXEC SQL FETCH cur_query INTO SQL DESCRIPTOR
		desc_query;
		if (SQLCODE == 100)
			break;
		EXEC SQL GET DESCRIPTOR desc_query :hcount = COUNT;
		printf("表%s共%d列\n", "v_sys_tables", hcount);
		printf("行#%d:\n", ++rowcnt);
		for (hindex=1;hindex<=hcount;++hindex)
		{
			EXEC SQL GET DESCRIPTOR desc_query \ 
			VALUE :hindex \
			:hlength = LENGTH, \
			:hname = NAME, \
			:hdata = DATA, \
			:hindicator = INDICATOR;
			printf("列#%d:变量名=%s,长度=%d, 值=%s\n ",hindex, \
				   hname, \
				   hlength, hindicator == -1 ? "null" : hdata);
		}
	}
	EXEC SQL COMMIT WORK;
	EXEC SQL DISCONNECT;
	exit(0);
}