指示变量¶
指示变量是与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);
}