返回首页

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

更新日期:2024年09月11日

修改线程数
更新全文索引采用多线程并行的方式,具体分为分词、排序、输出等线程。当服
务器CPU 核数比较大时,
可以通过修改这三个参数取值使性能达到最优。
当用户
想充分利用CPU 资源时,推荐该三个参数设置为CPU 核数*3/4 能使系统达到最
优。对应配置项参数如下:
4
4
3

gbase_stmt_attr_set
 摘要:
设置预处理语句的属性。
 语法:
gs_bool gbase_stmt_attr_set(GBASE_STMT *stmt, enum
enum_stmt_attr_type attr_type, const void *attr)
 参数:
“attr_type”参量是希望设置的选项,
“attr”参量是选项的值。
选 项
参量类型
功 能
STMT_ATTR_UPDATE_M
AX_LENGTH
gs_bool *
如果设为1:更新
gbase_stmt_store_result()中的元数
据GBASE_FIELD->max_length。
STMT_ATTR_CURSOR_T
YPE
unsigned
long *
调用gbase_stmt_execute()时,
语句将
打开的光标类型。*arg 可以是
CURSOR_TYPE_NO_CURSOR(默认值)或
CURSOR_TYPE_READ_ONLY。
STMT_ATTR_PREFETCH
_ROWS
unsigned
long *
使用光标时,一次从服务器获取的行
数。*arg 的范围从1 到unsigned long
的最大值。默认值为1。

 返回值:
如果OK,返回0。如果选项未知,返回非0 值。

集合派生表是一个虚拟表,其中表行中的值等价于集合的各个元素。当您在语法
图中看到对集合派生表的引用时,使用本段。该语法是 SQL ANSI/ISO 标准的扩
展。
语法

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1590
集合派生表

元素
描述
限制
语法
alias
作用域与 SELECT
语句的集合派生表
的临时名称。缺省
值取决于实现。
如果存在潜在的多义
性,必须把 alias
放在关键字 AS 前
面。请参阅 AS 关键
字。
标识符
collection_expr
任何对单个集合的
元素求值的表达式
请参阅集合表达式格
式的限制.
表达式
collection_var,
row_var
已归类或未归类的
集合变量名,或者
包含集合派生表的
GBase 8s ESQL/C
row 变量的名称
必须在 GBase 8s
ESQL/C 程序中或
(对
collection_var)在
0SPL 策略中已声明
请参阅
GBase 8s
ESQL/C 程
序员手册
或 DEFINE.
derived _column
表中派生的列的临
时名称
如果基础集合不是
ROW 数据类型,那么
只能指定一个派生列

标识符
用法
集合派生表可以出现在 UPDATEA 语句、SELECT 或 DELETE 语句的 FROM
子句或 INSERT 的 INTO 子句中 table 名称有效的地方。
使用集合派生表段完成这些任务:

如同访问表行一样,访问集合元素。

指定要访问的集合变量,而不是表名。

指定要访问的 ESQL/C row 变量,而不是表名。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1591
TABLE 关键字把一个集合转换成虚拟表。可以使用集合表达式格式来查询集合的
列,或则使用 collection 变量或 row 变量格式来操纵集合列中的数据。
通过虚拟表访问集合
当使用集合派生表段的集合表达式格式来访问集合元素时,可以通过虚拟表之间
选择集合元素。只能在 SELECT 语句的 FROM 子句中使用这种格式。FROM
子句可在查询或子查询中。
用这种格式可以使用连接、聚集、WHERE 子句、表达式、ORDER BY 子句以及
在使用集合变量格式时不可用的其它操作。这种格式减少了对多个游标和临时表
的需求。
可能的集合表达式示例包括列的引用、标量子查询、点表达式、函数、运算符
(通过重载)、集合子查询、文字集合、集合构造函数和强制转型函数等。
以下示例在 FROM 子句中使用 SELECT 语句,其结果集定义由第五十一到第七十
限定行组成的虚拟表,并按照 employee_id 列值排序。
SELECT * FROM TABLE(MULTISET(SELECT SKIP 50 FIRST 20 * FROM
employees ORDER BY employee_id)) vt(x,y), tab2 WHERE tab2.id = vt.x;
以下示例使用连接查询创建不超过 20 行(从第 41 行开始)的虚拟表,并按照
集合派生表的 salary 列的值排序:
SELECT emp_id, emp_name, emp_salary
FROM TABLE(MULTISET(SELECT SKIP 40 LIMIT 20 id, name,
salary FROM e1, e2
WHERE e1.id = e2.id ORDER BY salary ))
AS etab(emp_id, emp_name, emp_salary);
FROM 子句中的 Table 表达式
GBase 8s 支持 SELECT 查询和子查询的 FROM 子句中的表表达式的 ANSI/ISO
标准语法,作为 GBase 8s 扩展集合派生表语法的替代。在版本 10.00 和更早版
本的需要关键字 TABLE 和 MULTISET 。支持用于 SQL 的 ANSI/ISO 标准的
这些扩展,但不再需要在 SELECT 语句的 FROM 子句中的集合派生表规范。
以下两个查询返回相同的结果集,但只要第二个查询符合 ANSI/ISO 标准:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1592
SELECT * FROM TABLE(MULTISET(SELECT col1 FROM tab1 WHERE col1 =
100)) AS vtab(c1), (SELECT col1 FROM tab1 WHERE col1 = 10) AS
vtab1(vc1) ORDER BY c1;

SELECT * FROM (SELECT col1 FROM tab1 WHERE col1 = 100) AS vtab(c1),
(SELECT col1 FROM tab1 WHERE col1 = 10) AS vtab1(vc1)
ORDER BY c1;
同一个 SELECT 语句可以合并派生表的 GBase 8s 扩展和ANSI/ISO 语法的示
例:
SELECT * FROM (SELECT col1 FROM tab1 WHERE col1 = 100) AS vtab(c1),
TABLE(MULTISET(SELECT col1 FROM tab1 WHERE col1 = 10))
AS vtab1(vc1) ORDER BY c1;
子查询必须以两种格式的圆括号分隔,但紧跟在 TABLE 关键字后面并包含
MULTISET 集合子查询规范的外部圆括号(( ) )是 ANSI/ISO 语法的扩展。此
ANSI/ISO 语法仅在 SELECT 语句的 FROM 子句中有效。在任何其它上下文
中,您不能从集合子查询规范中省略这些关键字和括号。
集合表达式格式的限制
当使用集合表达式格式时,有一定的限制:

集合派生表是只读的。
o
它不能成为 INSERT 、UPDATE 或 DELETE 语句的目标。
要执行 INSERT 、UPDATE 或 DELETE 操作,必须使用集合变
量格式。
o
它不能成为可更新游标或视图的基础表。

在 SELECT 语句的 FROM 子句中,SPL 的 CALL 关键字不能优先于表
表达式的 TABLE 关键字。

如果集合是 LIST 数据类型,那么由此得到的集合派生表不会保存 LIST
中元素的顺序。

基础集合表达式求值不能等于 NULL。

集合表达式不能包含对远程数据库服务器上集合的引用。

集合表达式不能包含对出现在同一 FROM 子句的表的列引用。也就是
说,集合派生表必须独立于 FROM 子句中的其它表。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1593
例如,下面的语句返回了一个错误值。因为集合派生表 TABLE
(parents.children),引用了表 parents,这个表也在 FROM 子句中
引用:
SELECT COUNT(*) FROM parents,
TABLE(parents.children) c_table
WHERE parents.id = 1001;
要克服此限制,您可能需要写一个在 Projection 子句中包含子查询的查
询:
SELECT (SELECT COUNT(*)
FROM TABLE(parents.children) c_table)
FROM parents WHERE parents.id = 1001;
适用于 ESQL/C 的附加限制
除了前面描述的限制以外,在对 GBase 8s ESQL/C 使用集合表达式格式时还有下
列限制:

不能将未归类的 COLLECTION 指定为主变量数据类型。

不是使用 TABLE(?) 这种格式。
基本集合变量的数据类型必须是静态确定的。要克制这个限制,可以把变
量显式地强制转型成数据库服务器认可的已归类 Collection 数据类型
(SET 、MULTISET 或 LIST)。例如:
TABLE(CAST(? AS type))

不是使用 TABLE(:hostvar) 这种格式。
要克服这个限制,必须把变量显式地强制转型成数据库服务器的已归类
Collection 数据类型(SET 、MULTISET 或 LIST),例如:
TABLE(CAST(:hostvar AS type))
产生集合派生表的 Row 类型
如果没有指定派生列名,那么数据库服务器的行为取决于基本集合元素的数据类
型。
虽然集合派生表看起来包含单独的数据类型的列,但这些列实际上是 ROW 数据
类型的字段。ROW 类型的数据类型和列名取决于几个元素。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1594
如果基础集合表达式元素的数据类型是 type,那么数据库服务器通过以下规则来
确定集合派生表的 ROW 类型:

如果 type 是 ROW 数据类型,而且没有指定派生列的列表,那么集合派
生表的 ROW 类型就是 type。

如果 type 是 ROW 数据类型,而且指定了派生列的列表,那么集合派生
表的 ROW 类型就是未命名的 ROW 类型,其列数据类型和 type 相同,
列名从派生列的列表中获取。

如果 type 不是 ROW 数据类型,那么集合派生表的 ROW 类型就是未命
名的 ROW 类型,它包含一个 type 列,并且名称指定在派生列的列表
中。如果不能指定名称,数据库服务器会为列分配一个取决于实现的名
称。
下表给出的引申示例举例说明了这些规则。该表使用以下模式为例:
CREATE ROW TYPE person (name CHAR(255), id INT);
CREATE TABLE parents
(
name CHAR(255),
id INT,
children LIST (person NOT NULL)
);
CREATE TABLE parents2
(
name CHAR(255),
id INT,
children_ids LIST (INT NOT NULL)
);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1595
ROW
类型
显式派
生列列

集合派生表产生的
ROW 类型
代码示例


Type
SELECT (SELECT c_table.name
FROM TABLE(parents.children)
c_table WHERE c_table.id =
1002) FROM parents WHERE
parents.id = 1001;
在此示例中,c_table 的 ROW 类型是
parents。


未命名的 ROW 类
型,它的列类型是
Type ,而列名是
派生列的列表中的
名称
SELECT (SELECT c_table.c_name
FROM TABLE(parents.children)
c_table(c._name, c_id) WHERE
c_table.c_id = 1002) FROM
parents WHERE parents.id =
1001;
在此示例中,c_table 的 ROW 类型是
ROW(c_name CHAR(255), c_id INT)。
No
No
未命名的 ROW ,
它包含一个已指定
依实现而定的名称
的 Type 列
在以下示例中,如果不指定 c_id,数据
库服务器会为派生列指定一个名称。在这
种情况下,表 c_table 的 ROW 类型是
ROW(server_defined_name INT)。


未命名的 ROW 类
型,它包含一个
Type 列。列名在
派生列的列表中
SELECT(SELECT c_table.c_id
FROM TABLE(parents2.child_ids)
c_table (c_id) WHERE
c_table.c_id = 1002) FROM
parents WHERE parents.id =
1001;
这里,c_table 的 ROW 类型是 ROW(c_id
INT)。
下面的程序分段用返回单个值的 SPL 函数创建了一个集合派生表:
CREATE TABLE wanted(person_id int);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1596
CREATE FUNCTION
wanted_person_count (person_set SET(person NOT NULL))
RETURNS INT;
RETURN( SELECT COUNT (*)
FROM TABLE (person_set) c_table, wanted
WHERE c_tabel.id = wanted.person_id);
END FUNCTION;
下面的程序段给出了用返回多个值的 SPL 函数创建一个集合派生表的更通用的示
例:
-- Table of categories and child categories,
-- allowing any number of levels of subcategories
CREATE TABLE CategoryChild (
categoryId INTEGER,
childCategoryId SMALLINT
);

INSERT INTO CategoryChild VALUES (1, 2);
INSERT INTO CategoryChild VALUES (1, 3);
INSERT INTO CategoryChild VALUES (1, 4);
INSERT INTO CategoryChild VALUES (2, 5);
INSERT INTO CategoryChild VALUES (2, 6);
INSERT INTO CategoryChild VALUES (5, 7);
INSERT INTO CategoryChild VALUES (7, 8);
INSERT INTO CategoryChild VALUES (7, 9);
INSERT INTO CategoryChild VALUES (4, 10);

-- "R" == ROW type
CREATE ROW TYPE categoryLevelR (
categoryId INTEGER,
level SMALLINT );

-- DROP FUNCTION categoryDescendants (
-- INTEGER, SMALLINT );
CREATE FUNCTION categoryDescendants (
pCategoryId INTEGER,

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1597
pLevel SMALLINT DEFAULT 0 )
RETURNS MULTISET (categoryLevelR NOT NULL)

-- "p" == Prefix for Parameter names
-- "l" == Prefix for Local variable names
DEFINE lCategoryId LIKE CategoryChild.categoryId;
DEFINE lRetSet MULTISET (categoryLevelR NOT NULL);
DEFINE lCatRow categoryLevelR;

-- TRACE ON;
-- Must initialize collection before inserting rows
LET lRetSet = 'MULTISET{}' :: MULTISET (categoryLevelR NOT
NULL);
FOREACH
SELECT childCategoryId INTO lCategoryId
FROM CategoryChild WHERE categoryId = pCategoryId;
INSERT INTO TABLE (lRetSet)
VALUES (ROW (lCategoryId, pLevel+1)::categoryLevelR);

-- INSERT INTO TABLE (lRetSet);
-- EXECUTE FUNCTION categoryDescendantsR ( lCategoryId,
-- pLevel+1 );
-- Need to iterate over results and insert into SET.
-- See the SQL Tutorial, pg. 10-52:
-- "Tip: You can only insert one value at a time
-- into a simple collection."
FOREACH
EXECUTE FUNCTION categoryDescendantsR ( lCategoryId,
pLevel+1 )
INTO lCatRow;
INSERT INTO TABLE (lRetSet)
VALUES (lCatRow);
END FOREACH;
END FOREACH;


GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1598
RETURN lRetSet;
END FUNCTION
;
-- "R" == recursive
-- DROP FUNCTION categoryDescendantsR (INTEGER,
SMALLINT);
CREATE FUNCTION categoryDescendantsR (
pCategoryId INTEGER,
pLevel SMALLINT DEFAULT 0
)
RETURNS categoryLevelR;
DEFINE lCategoryId LIKE CategoryChild.categoryId;
DEFINE lCatRow categoryLevelR;

FOREACH
SELECT childCategoryId
INTO lCategoryId
FROM CategoryChild
WHERE categoryId = pCategoryId
RETURN ROW (lCategoryId, pLevel+1)::categoryLevelR WITH
RESUME;

FOREACH
EXECUTE FUNCTION categoryDescendantsR ( lCategoryId,
pLevel+1 )
INTO lCatRow
RETURN lCatRow WITH RESUME;
END FOREACH;
END FOREACH;
END FUNCTION;

-- Test the functions:
SELECT lev, col
FROM TABLE ((
categoryDescendants (1, 0)

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1599
)) AS CD (col, lev);
通过集合变量访问集合
当使用集合派生表段的集合变量格式时,将使用主变量或程序变量来访问和操纵
集合元素。这种格式允许修改变量的内容(如同您对数据库中的表一样)。然后
使用 collection 变量的内容更新实际表。
可以使用集合变量格式(关键字 TABLE 在 collection 变量的前面)代替下列
SQL 语句中(或在 SPL 的 FOREACH 语句中)的表名、同义词名或视图名:

SELECT 语句的 FROM 子句(用于访问 collection 变量的元素)

INSERT 语句的 INTO 子句(用于向 collection 变量添加新元素)

DELETE 语句(用于从 collection 变量除去元素)

UPDATE 语句(用于修改 collection 变量中的现有元素)

DECLARE 语句(用于声明 Select 或 Insert 游标来访问 GBase 8s
ESQL/C collection 主变量的多个元素)

FETCH 语句(用于检索与 Select 游标相关联的 collection 主变量中的单
个元素)

PUT 语句(用于检索与 Insert 游标相关联的 collection 主变量中的单个
元素)

FOREACH 语句(用于声明一个游标来访问 SPL 集合变量的多个元素以
及检索此 collection 主变量中的单个元素)
使用集合变量操纵集合元素
当使用 GBase 8s 的数据操纵语句(SELECT 、INSERT 、UPDATE 或
DELETE)和 collection 变量一起使用时,您可以修改集合中的一个和多个元
素。
修改集合中的约束
1. 在 SPL 例程或 GBase 8s ESQL/C 程序中创建一个 collection 变量。
有关如何在 GBase 8s ESQL/C 中声明 collection 集合变量的信息,请
参阅 GBase 8s ESQL/C 程序员手册。有关如何在 SPL 中定义
COLLECTION 变量,请参阅 DEFINE。

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1600
2. 在 GBase 8s ESQL/C 中,为集合分配内存;请参阅 ALLOCATE
COLLECTION 语句。
3. 可选地,使用 SELECT 语句将一个 COLLECTION 列选择到 collection
变量中。
如果变量是一个为归类的 COLLECTION 变量,那么在集合派生表段中使用
该变量之前,必须从 COLLECTION 列执行 SELECT。SELECT 语句允许数据
库服务器获取集合数据类型。
4. 使用适当的带集合派生表段的数据操纵语句在集合变量中添加、删除或修
改元素。
要在集合中插入多个元素或删除一个指定的元素,必须对集合变量使用游
标。

有关如何在 ESQL/C 中使用更新游标的更多信息,请参阅
DECLARE 语句。

关如何在 SPL 中使用更新游标的更多信息,请参阅 FOREACH。
5. 集合变量具有正确的元素以后,对包含实际集合列的表或视图使用
INSERT 或 UPDATE 语句,来保存集合变量的更改。

使用 UPDATE,在 SET 子句中指定集合变量。

使用 INSERT,在 VALUES 子句中指定集合变量。
集合变量存储集合的元素。不过,它与数据库列之间没有内在连接。一旦集合变
量包含了正确的元素,那么必须用 INSERT 或 UPDATE 语句把变量保存到表的
实际集合列中。
从 ESQL/C 中的集合执行删除操作的示例
假设把表 table1 某一行的 set_col 列定义为 SET ,并且有一行的值为
{1,8,4,5,2}。下面的 GBase 8s ESQL/C 代码段使用更新游标以及带有 WHERE
CURRENT OF 子句的 DELETE 语句来删除值为 4 的元素:
EXEC SQL BEGIN DECLARE SECTION;
client collection set(smallint not null) a_set;
int an_int;
EXEC SQL END DECLARE SECTION;

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1601
...
EXEC SQL allocate collection :a_set;
EXEC SQL select set_col into :a_set from table1 where int_col = 6;
EXEC SQL declare set_curs cursor for
select * from table(:a_set) for update;

EXEC SQL open set_curs;
while (i{
EXEC SQL fetch set_curs into :an_int;
if (an_int = 4)
{
EXEC SQL delete from table(:a_set) where current of set_curs;
break;
}
i++;
}
EXEC SQL update table1 set set_col = :a_set
where int_col = 6;
EXEC SQL deallocate collection :a_set;
EXEC SQL close set_curs;
EXEC SQL free set_curs;
执行 DELETE 语句以后,集合变量包含元素 {1,8,5,2}。位于代码段末尾的
UPDATE 语句把修改后的集合保存到 set_col 列中。如果没有 UPDATE 语句,
集合列中的元素 4 就没有删除。
从集合中执行删除操作的示例
假设把表 table1 某一行的 set_col 列定义为 SET ,并且有一行的值为
{1,8,4,5,2}。下面的 SPL 代码段使用 FOREACH 循环和带有 WHERE
CURRENT OF 子句的 DELETE 语句来删除值为 4 的元素:
CREATE_PROCEDURE test6()

DEFINE a SMALLINT;
DEFINE b SET(SMALLINT NOT NULL);

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1602
SELECT set_col INTO b FROM table1
WHERE id = 6;
-- Select the set in one row from the table
-- into a collection variable
FOREACH cursor1 FOR
SELECT * INTO a FROM TABLE(b);
-- Select each element one at a time from
-- the collection derived table b into a
IF a = 4 THEN
DELETE FROM TABLE(b)
WHERE CURRENT OF cursor1;
-- Delete the element if it has the value 4
EXIT FOREACH;
END IF;
END FOREACH;

UPDATE table1 SET set_col = b
WHERE id = 6;
-- Update the base table with the new collection

END PROCEDURE;
此 SPL 例程声明了两个 SET 变量,a 和 b,每一个都具有一组 SMALLINT
值。第一个 SELECT 语句把 table1 一行中的 SET 列复制到变量 b。然后例程
声明了一个名为 cursor1 的游标,它一次把一个元素从 b 复制到 SET 变量 a。
当游标位于值为 4 的元素时,DELETE 语句就从 SET 变量 b 中删除这个元
素。最后,UPDATE 语句把表 table1 的这一行用存储在变量 b 中的新集合替
代。
有关如何在 SPL 例程中使用集合变量的信息,请参阅 GBase 8s SQL 教程指南。
更新集合的示例
假设把表 table1 某一行的 set_col 列定义为 SET ,并且有一行的值为
{1,8,4,5,2}。下面的 GBase 8s ESQL/C 程序把值为 4 的元素改为 10:
main

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1603
{
EXEC SQL BEGIN DECLARE SECTION;
int a;
collection b;
EXEC SQL END DECLARE SECTION;

EXEC SQL allocate collection :b;
EXEC SQL select set_col into :b from table1
where int_col = 6;

EXEC SQL declare set_curs cursor for
select * from table(:b) for update;
EXEC SQL open set_curs;
while (SQLCODE != SQLNOTFOUND)
{
EXEC SQL fetch set_curs into :a;
if (a = 4)
{
EXEC SQL update table(:b)(x)
set x = 10 where current of set_curs;
break;
}
}
EXEC SQL update table1 set set_col = :b
where int_col = 6;
EXEC SQL deallocate collection :b;
EXEC SQL close set_curs;
EXEC SQL free set_curs;
}
执行这个 GBase 8s ESQL/C 程序以后,表 table1 的 set_col 列具有值
{1,8,10,5,2}。
这个 GBase 8s ESQL/C 程序定义了两个 collection 变量,a 和 b,并且从 table1
中选择了一个 SET 到 b.。WHERE 子句确保只返回一行。然后程序定义一个集

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1604
合游标,它从 b 中一次选择一个元素到 a。当程序找到值为 4 的元素时,第一
个 UPDATE 语句把该元素的值改为 10 并退出循环。
在第一个 UPDATE 语句中,x 是一个派生列名,用来在集合派生表中更新当前
元素。第二个 UPDATE 语句用新的集合更新基表 table1。
有关如何在 GBase 8s ESQL/C 中使用 collection 主变量的信息,请参阅 GBase
8s ESQL/C 程序员手册 中关于复杂数据类型的讨论。
在多重集合中插入值的示例
假定 GBase 8s ESQL/C 主变量 a_multiset 有下列声明:
EXEC SQL BEGIN DECLARE SECTION;
client collection multiset(integer not null) a_multiset;
EXEC SQL END DECLARE SECTION;
下面的 INSERT 语句把一个新的 MULTISET 元素 142,323 添加到
a_multiset:
EXEC SQL allocate collection :a_multiset;
EXEC SQL select multiset_col into :a_multiset from table1
where id = 107;
EXEC SQL insert into table(:a_multiset) values (142323);
EXEC SQL update table1 set multiset_col = :a_multiset
where id = 107;
EXEC SQL deallocate collection :a_multiset;
当要把元素插入到 client-collection 变量中时,不能在 INSERT 语句的 VALUES
子句中指定 SELECT 语句或 EXECUTE FUNCTION 语句。然而,当要把元素插
入到 server-collection 变量中时,SELECT 和 EXECUTE FUNCTION 语句在
VALUES 子句中是有效的。有关 client- 和 server-collection 变量的更多信息,
请参阅 GBase 8s ESQL/C 程序员手册。
访问嵌套集合
如果集合的元素本身就是复杂类型(collection 或 row 类型),那么这个集合
就是一个嵌套集合。例如,假设 GBase 8s ESQL/C collection 变量 a_set 是一
个嵌套集合,定义如下:

GBase 8s SQL 指南:语法
南大通用数据技术股份有限公司 1605
EXEC SQL BEGIN DECLARE SECTION;
client collection set(list(integer not null)) a_set;
client collection list(integer not null) a_list;
int an_int;
EXEC SQL END DECLARE SECTION;
要访问一个嵌套集合的元素(或字段),可以使用匹配元素类型(前面代码段中
的 a_list 和 an_int)的 collection 或 row 变量和 Select 游标。
访问 Row 变量
TABLE 关键字可以把 GBase 8s ESQL/C row 变量变成集合派生表。也就是说,
一行在 SQL 语句中作为表出现。对于行变量,把集合派生表看作只有一行的
表,行类型的每个字段就是行的一列。使用关键字 TABLE 在这些 SQL 语句中
代替表、同义词或视图的名称:

SELECT 语句的 FROM 子句(用来访问 row 变量的一个字段)

UPDATE 语句(用来修改 row 变量中已有的字段)
DELETE 和 INSERT 语句不支持集合派生表段的 row 变量。
例如,假设 ESQL/C 主变量 a_row 有以下声明:
EXEC SQL BEGIN DECLARE SECTION;
row(x int, y int, length float, width float) a_row;
EXEC SQL END DECLARE SECTION;
下面的 ESQL/C 代码段把 a_row 变量中的字段添加到表 tab_row 的 row_col
列:
EXEC SQL update table(:a_row)
set x=0, y=0, length=10, width=20;
EXEC SQL update rectangles set rect = :a_row;