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