返回首页

gbase数据、南大通用产品文档:GBase8agbase_max_allowed_level

更新日期:2024年09月11日

默认值1024
最大值2147483647
最小值1
分级查询的最大层级数,会影响计算使用的存储空间

GBase 8s ESQL/C 支持五种数据类型,可以容纳从数据库检索和发送到数据库的字符
数据。

如果对数据库列使用字符数据类型(例如 SQL 数据类型 CHAR 和 VARCHAR),
那么您可以为您的主机变量选择以下之一的数据类型:
C 字符数据类型:char
其中之一的 GBase 8s ESQL/C 预定义的数据类型:fixchar 、string 、varchar
lvarchar 数据类型

如果您使用区域设置敏感字符数据类型(NCHAR 或 NVARCHAR),那么可以选择
相关主机变量的字符数据类型。

以下两个条件决定要使用的字符数据类型:
是否要使 GBase 8s ESQL/C 使用空字符终止字符数据
是否需要 GBase 8s ESQL/C 来填充带有尾部空格的字符数据

下表总结了每个字符数据类型的属性。
表 1. ESQL/C 字符数据类型
ESQL/C 字符数据类型
Null 终止
包含尾部空格
char
Y
Y
fixchar

Y
string
Y
只当列包含空字
符串时才返回尾部空格
varchar
Y
Y
lvarchar
Y


char 数据类型
char 数据类型是持有字符数据的 C 数据类型。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 90 -

当应用程序将 CHAR 列的值读取为 char 类型的主机变量时,GBase 8s ESQL/C 将
此值附加到最大大小为主变量的尾部空格。它经终止主机数组的空字符留下一个位置。如
果应用程序从 VARCHAR (或 NVARCHAR)列读取一个值到 char 数据类型的主机变
量,则做出同样的操作。

声明长度为 [n + 1](其中 n 是您要读取的值的列的大小)的 char 数据类型,以允
许空终止符。使用以下语法声明 char 数据类型的主机变量:
EXEC SQL BEGIN DECLARE SECTION;
char ch_name[n + 1];
EXEC SQL END DECLARE SECTION;
fixchar 数据类型
fixchar 数据类型是持有不附加空终止符的字符数据的 GBase 8s ESQL/C 数据类型。

当应用程序将 CHAR 列的值读取为 fixchar 类型的主机变量时,GBase 8s ESQL/C
将此值附加到最大大小为主变量的尾部空格。GBase 8s ESQL/C 不会附加任何空字符。如
果应用程序从 VARCHAR (或 NVARCHAR)列读取一个值到 fixchar 数据类型的主机
变量,则做出同样的操作。

限制: 不要使用 VARCHAR 或 NVARCHAR 数据的 fixchar 数据类型。使用
fixchar,即使数据的长度小于 fixchar 的大小,数据库服务器也会存储 fixchar 的所有 n
个字符,包括字符串末尾的任何空格。除非空字符有意义,否则存储它们将使 VARCHAR
数据类型提供的空间节省失效。

将 fixchar 主机变量声明为具有 n 个组件的数组(其中 n 是您要读取的值的列的大
小)。使用以下语法声明 fixchar 数据类型的主机变量:
EXEC SQL BEGIN DECLARE SECTION;
fixchar fch_name[n];
EXEC SQL END DECLARE SECTION;

重要: 如果空字符可用于 null 字符,则可以将 null 值终止的 C 字符串复制到
fixchar 变量中。但是,这不是很好的做法。当数据库服务器将此值插入列时,它还会插入
空终止符。因此,稍后搜索表可能无法找到该值。
string 数据类型
string 数据类型是持有 null 终止符但不包含尾部空格的 GBase 8s ESQL/C 数据类型。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 91 -


但是,如果一个空格(即 ‘ ’)的字符串存储在数据库字段中并被选择到 string 数据
类型的主机变量中,那么结果将是一个空白字符。

当应用程序将 CHAR 列的值读取为 string 类型的主机变量时,
它将剥离任何尾部空
格的值,并附加一个 null 终止符。如果应用程序从 VARCHAR (或 NVARCHAR)列读
取一个值到 fixchar 数据类型的主机变量,则做出同样的操作。

此规则的一个例外是如果 BLANK_STRINGS_NOT_NULL 环境变量设置为 1 或其
它值
(比如 0 或 2)

那么字符串主机变量将空字符串存储为单个空格,
后跟一个 null 终
止符。如果未设置此环境变量,则字符串主机变量将空字符串存储为 null 字符串。
EXEC SQL BEGIN DECLARE SECTION;
string buffer[16];
EXEC SQL END DECLARE SECTION;


EXEC SQL select lname into :buffer from customer
where customer_num = 102;

声明长度为 [n + 1](其中 n 是您要读取的值的列的大小)的 string 数据类型,以允
许 null 终止符。
在上面的代码中,
customer 表的 lname 列是 15 字节,
因此 buffer 主
机变量声明为 16 字节。使用以下语法声明 string 数据类型的主机变量:
EXEC SQL BEGIN DECLARE SECTION;
string str_name[n + 1];
EXEC SQL END DECLARE SECTION;
varchar 数据类型
varchar 数据类型是持有可变长度的字符数据的 GBase 8s ESQL/C 数据类型。

当应用程序将 CHAR 列的值读取为 varchar 类型的主机变量时,GBase 8s ESQL/C
将保留任何尾部空白并以 NULL 字符终止此数组。
如果应用程序从 VARCHAR 列读取一
个值到 varchar 数据类型的主机变量,则做出同样的操作。

声明长度为 [n + 1](其中 n 是您要读取的值的列的大小)的 varchar 数据类型,以
允许 null 终止符。使用以下语法声明 varchar 数据类型的主机变量:

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 92 -

EXEC SQL BEGIN DECLARE SECTION;
varchar varc_name[n + 1];
EXEC SQL END DECLARE SECTION;

VARCHAR 大小宏

GBase 8s 包含具有 GBase 8s ESQL/C u库的 varchar.h 头文件、该文件定义下表中显
示的宏函数和名称。
表 2. VARCHAR 大小宏
宏的名称
描述
MAXVCLEN
您可以在 VARCHAR 列存储的最大字符数。该值为 255。
VCLENGTH(s)
要声明的主机变量的长度
VCMIN(s)
您可以在 VARCHAR 列存储的最小字符数。范围从 1 到 255 字
节,但必须小于 VARCHAR 的最大大小
VCMAX(s)
您可以在 VARCHAR 列存储的最大字符数。范围可以是1 到 255
字节。
VCSIZ(min, max)
基于 min 和 max 的编码大小值,用于 VARCHAR 列。

当使用动态 SQL 时,这些宏很有用。在 DESCRIBE 语句之后,宏可以处理数据库
服务器存储在系统描述符区域
(或 sqlda 的 sqllen 字段)
的 LENGTH 字段中的大小信息。
数据库服务器在 syscolumns 系统目录表中存储 VARCHAR 列的大小信息、

varchar.ec 演示程序

varchar.ec 演示程序从 syscolumns 系统目录表中获取 cat_advert 列
(stores7 数据库)
的 collength 。然后它使用 varchar.h 中的宏来显示关于列的大小信息。该示例程序位于
demo 目录中的 varchar.ec 文件中。下图显示了 varchar.ec 演示程序的 main() 函数。

图 1. varchar.ec 演示程序

/*
* varchar.ec *

The following program illustrates the use of VARCHAR macros to

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 93 -

obtain size information.
*/

EXEC SQL include varchar;

char errmsg[512];

main()
{
mint vc_code;
mint max, min;
mint hv_length;

EXEC SQL BEGIN DECLARE SECTION;
mint vc_size;
EXEC SQL END DECLARE SECTION;

printf("VARCHAR Sample ESQL Program running.\n\n");

EXEC SQL connect to 'stores7';
chk_sqlcode("CONNECT");

printf("VARCHAR field 'cat_advert':\n");
EXEC SQL select collength into $vc_size from syscolumns
where colname = "cat_advert";
chk_sqlcode("SELECT");
printf("\tEncoded size of VARCHAR (from syscolumns.collength) = %d\n",
vc_size);

max = VCMAX(vc_size);
printf("\tMaximum number of characters = %d\n", max);

min = VCMIN(vc_size);

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 94 -

printf("\tMinimum number of characters = %d\n", min);

hv_length = VCLENGTH(vc_size);
printf("\tLength to declare host variable = char(%d)\n", hv_length);

vc_code = VCSIZ(max, min);
printf("\tEncoded size of VARCHAR (from VCSIZ macro) = %d\n",
vc_code);

printf("\nVARCHAR Sample Program over.\n\n");
}

当 IFX_PAD_VARCHAR 环境变量设置为 1 时,客户端发送具有附加的尾部空格的
VARCHAR 数据类型、当未设置此环境变量(缺省),则客户端范式不带尾部空格的
VARCHAR 数据类型。
lvarchar 数据类型
lvarchar 数据类型是持有可变长度的字符数据的 GBase 8s ESQL/C 数据类型。

lvarchar 数据类型它实现类似于 varchar 数据类型的可变长度用户定义类型,但它
可以支持大于 256 个字节的字符串,并具有以下两个用途:
保存数据库中 LVARCHAR 列的值。
当应用程序从 LVARCHAR 列读取值到 lvarchar 数据类型的主机变量时,GBase 8s
ESQL/C 将保留任何尾随空格,并以 null 终止符终止数组。如果应用程序从 VARCHAR
列读取一个值到 lvarchar 数据类型的主机变量,则做出同样的操作。

表示不透明数据类型的字符串或外部格式。

重要: 您无法从 lvarchar 主机变量检索或存储智能大对象(CLOB 或 BLOB 数据
类型)。
lvarchar 关键字语法
要为字符列(CHAR 、VARCHAR 或 LVARCHAR)声明 lvarchar 主机变量。请使
用 lvarchar 关键字作为变量数据类型。

以下语法显示了 lvarchar 关键字作为变量数据类型。

GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 95 -



元素
意义
限制
variable
name
指定大小的 lvarchar 变
量的名称

variable
size
为指定大小的 lvarchar
变量分配的字节数
可以是 1 - 32,768(32 KB)之间的整数值。

*variabl
e name
未指定长度的 lvarchar
指针变量的名称
不等同于 C char 指针(char *)。指向此类
型的内部 ESQL/C 表示法。必须使用 ifx_var()
函数操纵数据。

下图显示持有 LVARCHAR 列的值的三个 lvarchar 变量的声明。图 2. lvarchar 主机
变量示例

EXEC SQL BEGIN DECLARE SECTION;
lvarchar *a_polygon;
lvarchar circle1[CIRCLESZ], circle2[CIRCLESZ];
EXEC SQL END DECLARE SECTION;
重要: 要声明不透明数据类型的外部格式 lvarchar 主机变量,使用声明
lvarchar 主机变量中描述的语法。
固定大小的 lvarchar 主机变量
如果未指定 lvarchar 主机变量的大小,
那么其大小等于一种 C 语言 char 数据类型。
如果指定了大小,则 lvarchar 主机变量等价于具有此大小的 C 语言 char 数据类型。当
您指定固定大小的 lvarchar 主机变量时,
获取该列时,
任何超出指定大小的数据都会被截
断。使用指示变量检查此截断。

因为已知大小的 lvarchar 主机变量等价于 C 语言 char 数据类型,
所以可以使用 C
语言字符字符串操作操纵数据。
lvarchar 指针主机变量
当 lvarchar 主机变量是一个指针时,
指针引用的数据的大小可以扩展到 2。
lvarchar
指针主机变量旨在插入或选择可以以字符串格式表示的用户定义或不透明类型。


GBase 8s ESQL/C 编程指南
南大通用数据技术股份有限公司
- 96 -

必须使用 ifx_var() 函数操纵 lvarchar 指针主机变量。

语法格式
ORDER BY {col_name | expr | position} [ASC | DESC] , ...
参数说明

ORDER BY 用于对结果集进行排序,数据列列名称或者表达式。

col_name:
指定排序的数据列,
多列之间用
“,”
分隔。
col_name 可以是SELECT
中使用AS 定义的别名。

expr:指定排序的表达式,多列之间用“,”分隔。

position :在“ SELECT col_name_1,..., col_name_n FROM ” 之间的
“col_name_1,..., col_name_n”的序号,position 是整数型数值,从“1”开始。

例如:
“SELECT stu_no,stu_name FROM stundent ORDER BY 1;”
语句中,
“1”
就是指代数据列stu_no。

ASC | DESC:如果希望对记录进行排序,可以使用ASC 或DESC 关键字来指
定排序规则,ASC 代表升序规则,DESC 代表降序规则。默认按照升序对记录
进行排序。
示例
示例1:... ORDER BY...
gbase> SELECT a.stu_name,math,english,sum(math+english) AS
total FROM student a
INNER
JOIN result b ON a.stu_no = b.stu_no GROUP BY a.stu_no ORDER BY a.stu_no;

GBase UP 产品手册 5 数据库管理指南
文档版本04(2021-04-21) 南大通用数据技术股份有限公司 707
+----------+------+---------+-------+
| stu_name | math | english | total |
+----------+------+---------+-------+
| Tom | 80.0 | 85.2 | 165.2 |
| Jim | 78.0 | 95.5 | 173.5 |
| John | 89.5 | 99.0 | 188.5 |
| Rose | 65.0 | 75.5 | 140.5 |
| Jane | 92.0 | 94.0 | 186.5 |
| Mike | 72.5 | 86.0 | 158.5 |
| Jack | 85.0 | 76.0 | 161.5 |
| Jerry | 95.0 | 97.0 | 192.0 |
| Allen | 56.0 | 78.0 | 134.0 |
| Max | 86.0 | 93.0 | 179.0 |
+----------+------+---------+-------+
10 rows in set