返回首页

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

更新日期:2024年09月11日

GBaseCommandBuilder 成员
公共静态成员(VB 中是Shared)方法
静态成员方法
描 述
DeriveParameters
从在 GBaseCommand 中指定的存储过



GBase 8a 程序员手册ADO.NET 篇
南大通用数据技术股份有限公司

- 149 -
静态成员方法
描 述
程中检索参数信息并填充指定的
GBaseCommand 对象的 Parameters 集
合。
公共构造函数
构造函数
描 述
GBaseCommandBuilder








GBaseCommandBuilder 类的一个实例。
属性
属 性
描 述
DataAdapter
获取或设置一个用于自动生成SQL 语
句的GBaseDataAdapter 对象。
公共方法
方 法
描 述
Dispose(继承于 Component)
释放所有 Component 使用的资源。
Equals(继承于 Object)
判断指定的对象是否等于当前的对象。

GetDeleteCommand
获得需要用于执行数据库删除的
GBaseCommand 对象,该对象是自动生
成的。
GetInsertCommand
获得需要用于执行数据库插入的
GBaseCommand 对象,该对象是自动生
成的。
GetType (继承于 Object)
获取当前实例的类型。
GetUpdateCommand
获得需要用于执行数据库更新
GBaseCommand 对象,该对象是自动生
成的。
RefreshSchema
刷新数据库模式(Schema)信息,该信

GBase 8a 程序员手册ADO.NET 篇


- 150 -

南大通用数据技术股份有限公司
方 法
描 述
息用于生成
INSERT, UPDATE, 或
DELET 语句。


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 203 -

SQLCODE 字段是数据库服务器的主要返回代码。在每个 SQL 语句之后,将 SQLCODE
设置为如下表所示的一个整数值。当那个值为零时,无误地执行该语句。特别地,当假定
一个语句将数据返回到主变量内时,代码零意味着已返回了该数据且可使用它。任何非零
代码都意味着相反的意思。未将有用的数据返回到了主变量。
表 1. SQLCODE 的值
返回值
解释
值 < 0
指定一个错误代码。
值 = 0
指示成功。
0 < 值 < 100 在 DESCRIBE 语句之后,表示描述 SQL 语句的类型的一个整数值。
100
在未返回行的成功查询之后,指示 NOT FOUND 条件。在 INSERT
INTO/SELECT、UPDATE、DELETE 或 SELECT... INTO TEMP 语句未能访
问任何行之后,NOT FOUND 还可发生在符合 ANSI 的数据库中。

数据的结束
当正确地执行语句,但未找到行时,数据库服务器将 SQLCODE 设置为 100。在两种情况
下可发生此情况。
第一种情况涉及使用游标的查询。
(检索多行 描述使用游标的查询。

在这些查询中,
FETCH
语句将来自活动集的每一值检索到内存内。检索最后一行之后,后续的 FETCH 语句不可
返回任何数据。当发生此情况时,数据库服务器将 SQLCODE 设置为 100,指示数据的结
束,找不到行。
第二种情况涉及不使用游标的查询。在此情况下,当没有行满足查询条件时,数据库服务
器将 SQLCODE 设置为 100。
在不符合 ANSI 的数据库中,
仅不返回行的 SELECT 语句
会导致将 SQLCODE 设置为 100。
在符合 ANSI 的数据库中,如果未返回行,则 SELECT、DELETE、UPDATE 和 INSERT
语句都将 SQLCODE 设置为 100。

负代码
在语句期间,
当发生意外错误时,
数据库服务器在 SQLCODE 中返回一个负数值来说明该
问题。在联机错误消息文件中记录这些代码的含义。

您可将值插入至集合内,而不声明游标。如果该集合为 SET 或 MULTISET,则将该值添
加到集合,但不定义新元素的位置,因为该集合没有特定的顺序。如果该值为 LIST,则您
可将新元素添加在 LIST 中特定的位置,或添加在 LIST 的末尾。
在 manager 表中,direct_reports 列包含 SET 类型的集合,且 projects 列包含 LIST。要将
名称添加到 direct_reports 列中的 SET,请使用带有集合派生的表的 INSERT 语句,如下
图所示。
图: 将值插入至集合。
CREATE PROCEDURE new_emp( emp VARCHAR(30), mgr VARCHAR(30) )

DEFINE r SET(VARCHAR(30) NOT NULL);

SELECT direct_reports INTO r FROM manager
WHERE mgr_name = mgr;

INSERT INTO TABLE (r) VALUES(emp);

UPDATE manager SET direct_reports = r
WHERE mgr_name = mgr;

END PROCEDURE;
此 SPL 过程将员工姓名和管理者姓名作为参数。
然后,
该过程为用户已输入了的管理者选
择 direct_reports 列中的集合,添加用户已输入了的员工名称,并以新集合更新 manager 表。

前图中的 INSERT 语句将用户提供的新的员工姓名插入至在集合变量 r 中包含的 SET
内。然后,UPDATE 语句将新集合存储在 manager 表中。
请注意 VALUES 子句的语法。将文字的数据和变量插入至集合变量内的语法规则如下:

使用 VALUES 关键字之后的圆括号来括起值的完整列表。

如果该集合为 SET、
MULTISET 或 LIST,
则请使用后跟方括号的类型构造函数来
将要插入的值的列表括起来。此外,必须将集合值括在引号中。
VALUES( "SET{ 1,4,8,9 }" )

如果该集合包含 row 类型,请使用后跟圆括号的 ROW 来将要插入的值的列表括
起来:

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 308 -

VALUES( ROW( 'Waters', 'voyager_project' ) )

如果该集合为嵌套的集合,则根据定义数据类型的方式,嵌套关键字、圆括号和方
括号:
VALUES( "SET{ ROW('Waters', 'voyager_project'),
ROW('Adams', 'horizon_project') }")
要获取关于将值插入至集合的信息,请参阅 修改数据。

插入至嵌套的集合内
如果您想要插入至嵌套的集合内,则 VALUES 子句的语法有变化。例如,假设您想要将
值插入至 图 1 展示的 numbers 表的 twin_primes 列内。
对于 twin_primes 列,您可能想要将 SET 插入至 LIST,或将元素插入至内层的 SET。下
列部分描述每一任务。
将集合插入至外层的集合内
将 SET 插入至 LIST 内,类似于将单个值插入至简单的集合内。
要将 SET 插入至 LIST 内,请声明集合变量来保存该 LIST,并将整个集合选择至它内。
当您使用集合变量作为集合派生的表时,该 LIST 中的每一 SET 成为该表的一行。然后,
您可将另一 SET 插入在该 LIST 的末尾或插入在指定的点。
例如,一个数值行的 twin_primes 列可能包含下列 LIST,如下图所示。
图: 样例 LIST。
LIST( SET{3,5}, SET{5,7}, SET{11,13} )
如果您将 LIST 视为集合派生的表,则它看上去可能像这样。
图: 将 LIST 视为集合派生的表。
{3,5}
{5,7}
{11,13}
您可能想要插入值 "SET{17,19}" 作为 LIST 中的第二项。下图中的语句展示如何执行。
图: 将值插入到 LIST 中。
CREATE PROCEDURE add_set()

DEFINE l_var LIST( SET( INTEGER NOT NULL ) NOT NULL );

SELECT twin_primes INTO l_var FROM numbers
WHERE id = 100;


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 309 -

INSERT AT 2 INTO TABLE (l_var) VALUES( "SET{17,19}" );

UPDATE numbers SET twin_primes = l
WHERE id = 100;

END PROCEDURE;
在 INSERT 语句中,VALUES 子句将值 SET {17,19} 插入在 LIST 的第二个位置。现在,
该 LIST 看上去像下图这样。
图: LIST 项。
{3,5}
{17,19}
{5,7}
{11,13}
通过将 SET 作为参数传到 SPL 例程,您可执行相同的插入,如下图所示。
图: 将 SET 作为参数传到 SPL 例程。
CREATE PROCEDURE add_set( set_var SET(INTEGER NOT NULL),
row_id INTEGER );

DEFINE list_var LIST( SET(INTEGER NOT NULL) NOT NULL );
DEFINE n SMALLINT;

SELECT CARDINALITY(twin_primes) INTO n FROM numbers
WHERE id = row_id;

LET n = n + 1;

SELECT twin_primes INTO list_var FROM numbers
WHERE id = row_id;

INSERT AT n INTO TABLE( list_var ) VALUES( set_var );

UPDATE numbers SET twin_primes = list_var
WHERE id = row_id;

END PROCEDURE;

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 310 -

在 add_set() 中,
用户提供 SET 来添加到 LIST,
以及标识将 SET 插入其中的那行的 id 的
INTEGER 值。
将值插入至内层的集合
在 SPL 例程中,
您还可将值插入至嵌套的集合的内层集合。
通常,
要访问嵌套的集合的内
层集合并将值插入到它,请执行下列步骤:
1. 声明集合变量来在表的一行中保存整个集合。
2. 声明元素变量来保存该外层的集合的一个元素。元素变量本身是集合变量。
3. 将整个集合从表的一行选择至集合变量。
4. 声明游标,以便您可在外层的集合的元素间移动。
5. 一次将一个元素选择至元素变量内。
6. 请使用分支或循环来定位您想要更新的内层集合。
7. 将新值插入至内层的集合内。
8. 关闭游标。
9. 以新的集合更新数据库表。
作为示例,您可在 numbers 的 twin_primes 列上使用此过程。 例如,假设 twin_primes 包含
下图所示的值,且您想要将值 18 插入至 LIST 的最后的 SET 中。
图: twin_primes 列表。
LIST( SET( {3,5}, {5,7}, {11,13}, {17,19} ) )
下图展示插入该值的过程的开始。
图: 插入值的过程。
CREATE PROCEDURE add_int()

DEFINE list_var LIST( SET( INTEGER NOT NULL ) NOT NULL );
DEFINE set_var SET( INTEGER NOT NULL );

SELECT twin_primes INTO list_var FROM numbers
WHERE id = 100;
至此,attaint 过程已执行了步骤 1、2 和 3。第一个 DEFINE 语句声明保存在一个数值行中
的整个集合的集合变量。
第二个 DEFINE 语句声明保存该集合的元素的元素变量。在此情况下,元素变量本身是集
合变量,因为它保存 SET。SELECT 语句将整个集合从一行选择至集合变量 list_var 内。
下图展示如何声明游标,以便于您可在外层的集合的元素间移动。
图: 声明游标来在外层的集合的元素间移动。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司 - 311 -

FOREACH list_cursor FOR
SELECT * INTO set_var FROM TABLE( list_var);

FOREACH element_cursor FOR