指示数组变量实例¶
例 5-2
/*****************************************************************************
esql*C 使用指示数组实例 *
*****************************************************************************/
#include <stdio.h>
#include <stdlib.h>
void error()
{
/* 对错误情况不予处理,以防止死循环*/
EXEC SQL WHENEVER SQLERROR CONTINUE;
/* 输出错误信息*/
sqlprint();
EXEC SQL ROLLBACK WORK;
exit(1);
}
int main()
{
int n;
long SQLCODE;
/*声明宿主数组变量*/
EXEC SQL BEGIN DECLARE SECTION;
char hnum[10][4];
char hname[10][21];
char hcity[10][16];
int hgrade[10];
int hbrchnum[10];
int ind_grade[10];
int ind_city[10];
int ind_brchnum[10];
EXEC SQL END DECLARE SECTION;
/*
初始化要插入的宿主数组变量和指示数组变量,其中员工编号从E7-E17,为了简单起见,员工的名字都是卢比,级别均未评定,都来自建德,子公司未定。*/
for (n = 0; n < 10; n++)
{
hnum[n][0] = 'E';
if (7 + n >= 10)
{
hnum[n][1] = '1';
hnum[n][2] = 7 + n - 10 + '0';
hnum[n][3] = '\0';
}
else
{
hnum[n][1] = 7 + n + '0';
hnum[n][2] = '\0';
}
strcpy(hname[n], "卢比");
strcpy(hcity[n], "建德") ;
hgrade[n] = 5;
hbrchnum[n] = 571;
ind_brchnum[n] = -1;
ind_grade[n] = -1;
ind_city[n] = -1;
}
EXEC SQL WHENEVER SQLERROR do error();
EXEC SQL WHENEVER NOT FOUND goto not_found;
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),
brchnum INT);
if (SQLCODE == 0)
{
printf("表employee成功创建!\n");
}
EXEC SQL INSERT INTO employee \
VALUES(:hnum, :hname, :hgrade, :hcity, :hbrchnum);
if (SQLCODE == 0)
{
printf("已经成功插入10个来自建德在杭州工作的员工的元组!\n");
}
/* 重置存放结构的宿主数组变量和指示数组变量 */
for (n = 0; n < 10; n++)
{
hnum[n][0] = '\0';
hname[n][0] = '\0';
hcity[n][0] = '\0';
hgrade[n] = -1;
hbrchnum[n] = -1;
ind_grade[n] = -1;
ind_city[n] = -1;
}
/* 执行下面的SELECT语句有一个前提条件,即表employee中city值为"建德"的元组数不能大于10 */
EXEC SQL SELECT empnum,empname, grade, city, brchnum \
INTO :hnum, :hname, :hgrade:ind_grade, :hcity:ind_city, \
:hbrchnum:ind_brchnum \
FROM employee \
WHERE city = '建德';
/* ind_grade<0,表示对应的宿主数组元素为null*/
for (n = 0; n < 10; n++)
{
printf("员工信息#%d:%s, %s, %s,%d, %d\n", \
n+1, hnum[n], hname[n], ind_city < 0? "null":hcity[n], \
ind_grade < 0 ? -1 : hgrade[n], hbrchnum[n]);
}
EXEC SQL DROP TABLE employee;
EXEC SQL COMMIT WORK;
EXEC SQL DISCONNECT;
exit(0);
not_found:
printf("表employee中没有数据了.\n");
EXEC SQL DROP TABLE employee;
EXEC SQL ROLLBACK WORK;
EXEC SQL DISCONNECT;
exit(1);
}