Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (中文) » SQL Anywhere 服务器 - 编程 » SQL Anywhere 数据访问 API » SQL Anywhere 嵌入式 SQL » 使用主机变量

 

C 主机变量类型

仅有有限数量的 C 数据类型可作为主机变量。而且,某些主机变量类型没有对应的 C 类型。

sqlca.h 头文件中定义的宏可用于声明以下类型的主机变量:NCHAR、VARCHAR、NVARCHAR、LONGVARCHAR、LONGNVARCHAR、BINARY、LONGBINARY、DECIMAL、FIXCHAR、NFIXCHAR、DATETIME (SQLDATETIME)、BIT、BIGINT 或 UNSIGNED BIGINT。它们的使用方法如下所示:

EXEC SQL BEGIN DECLARE SECTION;
DECL_NCHAR                 v_nchar[10];
DECL_VARCHAR( 10 )         v_varchar;
DECL_NVARCHAR( 10 )        v_nvarchar;
DECL_LONGVARCHAR( 32768 )  v_longvarchar;
DECL_LONGNVARCHAR( 32768 ) v_longnvarchar;
DECL_BINARY( 4000 )        v_binary;
DECL_LONGBINARY( 128000 )  v_longbinary;
DECL_DECIMAL( 30, 6 )      v_decimal;
DECL_FIXCHAR( 10 )         v_fixchar;
DECL_NFIXCHAR( 10 )        v_nfixchar;
DECL_DATETIME              v_datetime;
DECL_BIT                   v_bit;
DECL_BIGINT                v_bigint;
DECL_UNSIGNED_BIGINT       v_ubigint;
EXEC SQL END DECLARE SECTION;

预处理器能够识别声明部分中的这些宏,并可将变量视为相应的类型。建议不要使用 DECIMAL(DT_DECIMAL、DECL_DECIMAL)类型,因为十进制数值的格式为专有格式。

下表列出了允许用于主机变量的 C 变量类型及其对应的嵌入式 SQL 接口数据类型。

C 数据类型 嵌入式 SQL 接口类型 说明
short              si;
short int          si;
DT_SMALLINT 16 位有符号整数。
unsigned short int usi;
DT_UNSSMALLINT 16 位无符号整数。
long              l;
long int          l;
DT_INT 32 位有符号整数。
unsigned long int ul;
DT_UNSINT 32 位无符号整数。
DECL_BIGINT       ll;
DT_BIGINT 64 位有符号整数。
DECL_UNSIGNED_BIGINT ull;
DT_UNSBIGINT 64 位无符号整数。
float f;
DT_FLOAT 4 字节浮点数。
double d;
DT_DOUBLE 8 字节浮点数。
char a[n]; /*n>=1*/
DT_STRING 在 CHAR 字符集中以空值终止的字符串。如果数据库是使用填补空白的字符串进行的初始化,则该字符串是填补空白的。此变量占有 n-1 个字符加上空终止符。
char *a;
DT_STRING 在 CHAR 字符集中以空值终止的字符串。此变量指向一个可保存最多 32766 个字节加上空终止符的区域。
DECL_NCHAR a[n]; /*n>=1*/
DT_NSTRING 在 NCHAR 字符集中以空值终止的字符串。如果数据库是使用填补空白的字符串进行的初始化,则该字符串便是用空白填补的。此变量占有 n-1 个字符加上空终止符。
DECL_NCHAR *a;
DT_NSTRING 在 NCHAR 字符集中以空值终止的字符串。此变量指向一个可保存最多 32766 个字节加上空终止符的区域。
DECL_VARCHAR(n) a;
DT_VARCHAR 在 CHAR 字符集中具有双字节长度字段的变长字符串。不是以空值终止的或填补空白的。n 的最大值为 32765(字节)。
DECL_NVARCHAR(n) a;
DT_NVARCHAR 在 NCHAR 字符集中具有双字节长度字段的变长字符串。不是以空值终止的或填补空白的。n 的最大值为 32765(字节)。
DECL_LONGVARCHAR(n) a;
DT_LONGVARCHAR 在 CHAR 字符集中具有三个 4 字节长度字段的变长长字符串。不是以空值终止的或以空白填补的。
DECL_LONGNVARCHAR(n) a;
DT_LONGNVARCHAR 在 NCHAR 字符集中具有三个 4 字节长度字段的变长长字符串。不是以空值终止的或以空白填补的。
DECL_BINARY(n) a;
DT_BINARY 具有长度为 2 个字节的字段的变长二进制数据。n 的最大值为 32765(字节)。
DECL_LONGBINARY(n) a;
DT_LONGBINARY 具有三个长度为 4 个字节的字段的长型变长二进制数据。
char            a; /*n=1*/ 
DECL_FIXCHAR(n) a;
DT_FIXCHAR 在 CHAR 字符集中固定长度的字符串。是填补空白的但不是以空值终止的。n 的最大值为 32767(字节)。
DECL_NCHAR       a; /*n=1*/
DECL_NFIXCHAR(n) a;
DT_NFIXCHAR 在 NCHAR 字符集中固定长度的字符串。是填补空白的但不是以空值终止的。n 的最大值为 32767(字节)。
DECL_DATETIME a;
DT_TIMESTAMP_STRUCT SQLDATETIME 结构
字符集

对于 DT_FIXCHAR、DT_STRING、DT_VARCHAR 和 DT_LONGVARCHAR,字符数据采用应用程序的 CHAR 字符集,此字符集通常是应用程序区域设置的字符集。应用程序可使用 CHARSET 连接参数或通过调用 db_change_char_charset 函数来更改 CHAR 字符集。

对于 DT_NFIXCHAR、DT_NSTRING、DT_NVARCHAR 和 DT_LONGNVARCHAR,数据采用应用程序的 NCHAR 字符集。缺省情况下,应用程序的 NCHAR 字符集与 CHAR 字符集相同。应用程序可以通过调用 db_change_nchar_charset 函数来更改 NCHAR 字符集。

有关地区和字符集的详细信息,请参见了解区域设置

有关更改 CHAR 字符集的详细信息,请参见CharSet 连接参数 [CS]db_change_char_charset 函数

有关更改 NCHAR 字符集的详细信息,请参见db_change_nchar_charset 函数

数据长度

无论使用的是 CHAR 还是 NCHAR 字符集,所有数据长度均以字节为单位指定。

如果服务器和应用程序之间发生字符集转换,则应用程序负责确保缓冲区足够大以便处理转换的数据,并在数据被截断时发出附加 GET DATA 语句。

字符指针

数据库接口认为一个声明为字符指针 (char * a) 的主机变量的长度为 32767 个字节。用于从数据库检索信息的任何字符指针类型的主机变量都必须指向一个缓冲区,该缓冲区的大小要足以容纳可能从数据库返回的任何值。

这具有相当大的潜在危险,因为可能会有人更改数据库中列的定义,使列比编写程序时更大。这可能会导致随机内存损坏问题。使用声明数组会比较好,甚至是作为函数的参数,其中数组是作为字符指针传递的。此技术可让嵌入式 SQL 语句知道数组的大小。

主机变量的范围

标准主机变量声明部分可以出现在通常声明 C 变量的任意位置,包括 C 函数的参数声明部分。C 语言变量有其常规作用域(在定义它们的块中可用)。但是,因为 SQL 预处理器不扫描 C 代码,所以它不会考虑 C 语言块。

就 SQL 预处理器而言,主机变量对源文件来说是全局的;两个主机变量不能同名。