宿主变量

宿主变量是指存放SQL语句输入、输出的变量,简称主变量。宿主变量必须在DECLARE段中说明。

宿主变量分类

根据主变量在程序中所起的作用,可以分为输入主变量和输出主变量。

一个SELECT或者FETCH语句的INTO子句中和DESCRIBE的USING子句中的主变量称为输出主变量, 它们用于保存从后台输入库获得的列值。神通数据库把列值赋给相应的INTO子句中的输出主变量。

所有SQL语句中的其它主变量都称为输入主变量,应用程序把这些变量的值输入给神通数据库。 例如,可以在INSERT语句的VALUES子句中和UPDATE语句的SET子句中使用输入主变量。 它们也可以用在WHERE、HAVING和FOR子句中。 输入主变量可以出现在一个SQL语句中所有允许值或者表达式出现的地方。

注解

在ORDER BY子句中,可以使用主变量,但是并不能得到用户预期的结果。 比如,如下SQL语句:

strcpy(ord, "empnum");
EXEC SQL SELECT empname, empnum INTO :hname, :hnum
FROM employee ORDER BY :ord;

在ORDER BY子句中,包含了一个输入主变量:ord,它的值为"empnum", 用户希望根据empnum列值对结果表排序。然而,在这种情况下主变量值会经过系统的处理, 在发给后台数据库时,已经在列名的前后加上了单引号, 所以,后台数据库会因为无法识别该格式而报错——"Non-integer constant in ORDER BY", 用户可以在执行SELECT语句后通过调用sqlprint查看这个错误信息。

注解

不能用输入主变量提供SQL关键字或者数据库对象的名字。 所以,在数据定义语句(DDL)中不能使用输入主变量,比如ALTER、CREATE和DROP语句。 下面是一个用主变量输入表名的例子,这种使用方法是错误的:

EXEC SQL BEGIN DECLARE SECTION;
char htabname[20]; --主变量必须定义在DECLARE段中
EXEC SQL END DECLARE SECTION;
printf("Please input table name:\n");
gets(htabname);
EXEC SQL DROP TABLE :htabname; --不允许使用主变量

注解

如果需要在运行时改变数据库对象的名字,请使用动态SQL。 详情请参见 动态SQL语句

在神通数据库执行一个包含输入主变量的SQL语句之前,必须先赋值给主变量。 下面是一个简单的使用输入主变量的例子:

EXEC SQL BEGIN DECLARE SECTION;
int hnum;
char hname[20];
EXEC SQL END DECLARE SECTION;
hnum = 20;
strcpy(hname, "汤金森");
EXEC SQL INSERT INTO employee(hnum, hname)
VALUES(:hnum, :hname);

输入主变量在SQL语句中必须用冒号(:)做前缀,这是主变量的使用必须符合的准则之一。

宿主变量使用准则

一个宿主变量的使用必须符合如下准则:

  • 必须在DECLARE段明确说明;
  • 必须先说明后使用;
  • 在SQL语句里必须以冒号(:)作前缀;
  • 在C语句中不得以冒号作前缀;
  • 不得与SQL保留字同名;
  • 只能在允许使用常量的地方使用;
  • 可以与一个指示变量相关(指示变量将在后一小节说明);
  • 不能在动态命令中使用宿主变量。

宿主变量类型

esql*C中合法的宿主变量类型见下表:

表 -1

类型 含义 说明
char 字符串类型 单个字符、一维或二维数组
varchar 变长字符串类型 一维或二维数组
long 长整型 标量或一维数组
int 整型 标量或一维数组
short 短整型 标量或一维数组
float 浮点型 标量或一维数组
double 双精度型 标量或一维数组
__int64 8字节整型 标量或一维数组(WINDOWS环境)
long long [int] 8字节整型

标量或一维数组

(LINUX环境)

注解

如果超过说明的维数,系统就会报错。因为系统不支持更高的维数。 用户可以根据预处理报错进行相应的调整。