返回首页

gbase数据、南大通用产品文档:GBase8s从集合选择元素

更新日期:2024年09月11日


GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 303 -
假设您想要您的 SPL 例程从存储在集合变量内的集合选择元素,
则请一次选择一个,
以便
于您可处理这些元素。
要在集合的元素间移动,
您首先需要使用 FOREACH 语句来声明游标,
就如同您会声明游
标来在一组行间一同一样。
下图展示 FOREACH 和 END FOREACH 语句,
在它们之间还
没有语句。
图: FOREACH 和 END FOREACH 语句。
FOREACH cursor1 FOR
. . .
END FOREACH
在 FOREACH 循环 和 GBase 8s SQL 指南:语法 中描述 FOREACH 语句。
下一主题,集合查询,描述在 FOREACH 与 END FOREACH 语句之间省略的那些语句。

下列部分中的示例是基于 图 2 的 polygons 表的。

集合查询
在您在 FOREACH 与 END FOREACH 语句之间声明游标之后,
请您输入称为集合查询的
特殊的、受限形式的 SELECT 语句。
集合查询是使用后跟集合变量的名称的 FROM TABLE 关键字的 SELECT 语句。下图展
示此结构,称其为集合派生的表。
图: 集合派生的表。
FOREACH cursor1 FOR

SELECT * INTO pnt FROM TABLE(vertexes)
. . .
END FOREACH
该 SELECT 语句使用集合变量 vertexes 作为集合派生的表。
您可将集合派生的表视为一列
的表,
该集合的每一元素都是表的一行。
例如,
您可将存储在 vertexes 中的四个点的 SET 可
视化作为带有四行的表,诸如下图展示的一个。
图: 带有四行的表。
'(3.0,1.0)'
'(8.0,1.0)'
'(3.0,4.0)'
'(8.0,4.0)'
在前图中的 FOREACH 语句的第一个迭代之后,
该集合查询选择 vertexes 中的第一个元素,
并将其存储在 pnt 中,因此,pnt 包含值 '(3.0,1.0)'。

GBase 8s SQL 指南:教程
南大通用数据技术股份有限公司
- 304 -
提示: 由于集合变量 vertexes 包含 SET,而不是 LIST,因此,vertexes 中的元素没有定义了的
顺序。在真实的数据库中,值 '(3.0,1.0)' 可能不是 SET 中的第一个元素。
将集合查询添加至 SPL 例程
现在,您可将以 FOREACH 定义的游标和集合查询添加至 SPL 例程,如下例所示。
图: 以 FOREACH 定义的游标和集合查询。
CREATE PROCEDURE shapes()

DEFINE vertexes SET( point NOT NULL );
DEFINE pnt point;

SELECT definition INTO vertexes FROM polygons
WHERE id = 207;

FOREACH cursor1 FOR
SELECT * INTO pnt FROM TABLE(vertexes)
. . .
END FOREACH
. . .
END PROCEDURE;
以上展示的语句形成处理集合变量的元素的 SPL 例程的框架。要将集合分解为它的元素,
请使用集合派生的表。在将集合分解为它的元素之后,该例程可单独地访问元素作为集合
派生的表的行。既然您已选择了 pnt 中的一个元素,您就可更新或删除那个元素,如 更新
集合元素 和 删除集合元素 描述的那样。
要了解集合查询的完整语法,请参阅《GBase 8s SQL 指南:语法》 中的 SELECT 语句。
要了解集合派生的表的语法,请参阅《GBase 8s SQL 指南:语法》 中的“集合派生的表”
段。
提示:
如果您正在从不包含元素或包含零元素的集合选择,
则您可使用未声明游标的集合查询。
然而,如果该集合包含多个元素,且您未使用游标,则您会收到错误消息。
注意: 在上述程序段中,如果 FOREACH 游标定义内的查询(
SELECT * INTO pnt FROM TABLE(vertexes)
)已以分号(;)作为语句终止符终止了,则数据库服务器可能已发出了语法错误。在此,
END FOREACH 关键字是逻辑的语句终止符。


GBase 8s ODBC Driver 程序员指南
南大通用数据技术股份有限公司
- 215 -
SQLColumns 返回指定表的列名。驱动程序将此信息作为指定 hstmt 上的结果集返回。
下表描述了SQLColumns 的 SQLSTATE 和错误消息。
SQLSTATE
错误值
错误消息
01000
-11001
General warning
08S01
-11020
Communication-link failure
24000
-11031
Invalid cursor state
S1000
-11060
General error
S1001
-11061
Memory-allocation failure
S1008
-11065
Operation canceled
S1010
-11067
Function-sequence error
S1090
-11071
Invalid string or buffer length
S1C00
-11092
Driver not capable
S1T00
-11094
Time-out expired
S1C00
-11300
SQL_DEFAULT_PARAM not supported
08S01
-11301
A protocol error has been detected. Current connection is
closed.
S1000
-11310
Create and Drop must be executed within a ServerOnly
Connection
S1000
-11320
Syntax error
S1000
-11323
The statement contained an escape clause not supported by
this database driver

并发控制模块(简称CC 模块)提供了主内存引擎的所有事务性需求。CC 模块的主要
目标是为主内存引擎提供各种隔离级别的支持。