SQL/MM 标准根据建立于 ANSI/SQL CREATE TYPE 语句基础之上的用户定义扩展类型 (UDT) 定义空间数据支持。虽然 SQL Anywhere 不支持用户定义的类型,但仍然实现了 SQL Anywhere 空间数据支持,就好像它们受支持一样。
可通过调用构造函数来实例化用户定义类型的值,如下所示:
NEW type-name( argument-list)
例如,查询可以包含以下内容以实例化两个 ST_Point 值:
SELECT NEW ST_Point(), NEW ST_Point(3,4) |
SQL Anywhere 使用常规重载解决规则对照已定义的构造程序来匹配 argument-list。出现以下情况时会返回错误:
NEW 与不是用户定义类型的类型一起使用
无法实例化用户定义类型(例如,ST_Geometry 不是可实例化的类型)。
没有与提供的参数类型相匹配的重载
请参见:
用户定义类型可以定义实例方法。在类型的值上调用实例方法如下:
value-expression.method-name( argument-list )
例如,以下虚构的示例会选择 Massdata.CenterPoint 列的 X 坐标:
SELECT CenterPoint.ST_X() FROM Massdata; |
如果存在名为 CenterPoint 的用户 ID,数据库服务器会将 [CenterPoint.ST_X()
] 视为不明确。这是因为该语句可能表示 "调用用户 CenterPoint 拥有的用户定义函数 ST_X"(不是此语句的正确意图),也可能表示 "调用 Massdata.CenterPoint 列上的 ST_X 方法"(该语句的正确意思)。数据库服务器解决此类不明确问题的方法是首先执行区分大小写的搜索来查找名为
CenterPoint 的用户。如果找到用户,则数据库服务器将继续,就好像正在调用一个用户定义的且由用户 centerpoint 所拥有的函数 ST_X 一样。如果未找到用户,则数据库服务器会将该结构视为方法调用并对 Massdata.CenterPoint
列调用 ST_X 方法。
出现以下情况时调用实例方法会给出错误:
value-expression 声明的类型不是用户定义的类型
value-expression 声明的类型或其某个超类型中未定义指定方法
argument-list 与为指定方法定义的某个重载不匹配。
请参见:
除了实例方法,ANSI/SQL 标准还可以将用户定义类型与静态方法关联。使用以下语法调用静态方法:
type-name::method-name( argument-list )
例如,以下语句通过分析文本将 ST_Point 实例化:
SELECT ST_Geometry::ST_GeomFromText('POINT( 5 6 )') |
出现以下情况时调用静态方法会给出错误:
value-expression 声明的类型不是用户定义的类型
value-expression 声明的类型或其某个超类型中未定义指定方法
argument-list 与为指定方法定义的某个重载不匹配
请参见:
作为 ANSI/SQL 的扩展,SQL Anywhere 支持实现用户定义集合的静态方法。例如:
SELECT ST_Geometry::ST_AsSVGAggr(T.geo) FROM table T |
静态方法的所有重载都必须是集合的或者任何重载都不是集合的。
出现以下情况时调用静态集合方法会给出错误:
静态方法调用给出错误
内置集合函数给出错误
指定了 WINDOW 子句
请参见:
ANSI/SQL 标准定义的类型谓语允许语句检查值的具体类型(在其它语言中也称为对象类型)。语法如下:
value IS [ NOT ] OF ( [ ONLY ] type-name,...)
如果 value 为 NULL,则谓语返回 UNKNOWN。否则,将 value 的具体类型与 type-name 列表中的每个元素进行比较。如果指定 ONLY,则具体类型正好是指定类型时存在匹配项。否则,具体类型是指定类型或任何派生类型(子类型)时存在匹配项。
如果 value 的具体类型与列表中的一个元素相匹配,则返回 TRUE,否则返回 FALSE。
以下示例返回 Shape 列值的具体类型为 ST_Curve 或其子类型(ST_LineString、ST_CircularString 或 ST_CompoundCurve)之一的所有行:
SELECT * FROM SpatialShapes WHERE Shape IS OF ( ST_Curve ); |
请参见:
ANSI/SQL 标准定义的子类型处理表达式允许将表达式的声明类型从超类型高效转换为子类型。当您知道表达式的具体类型(在其它语言中也称为对象类型)是指定子类型或指定子类型的子类型时,可使用此表达式。使用 CAST 函数时会更有效,因为 CAST 函数制作值的副本,而 TREAT 不制作副本。语法如下:
TREAT( value-expression AS target-subtype )
如果没有出现错误,则结果是声明的类型为 target-subtype 的 value-expression。
出现以下情况时子类型处理表达式会给出错误:
value-expression 不是用户定义的类型
如果 target-subtype 不是 value-expression 的声明类型的子类型
如果 value-expression 的动态类型不是 target-subtype 的子类型
以下示例将 ST_Geometry Shape 列的声明类型有效地更改为 ST_Curve 子类型,以便能够调用 ST_Curve 类型的 ST_Length 方法:
SELECT ShapeID, TREAT( Shape AS ST_Curve ).ST_Length() FROM SpatialShapes WHERE Shape IS OF ( ST_Curve ); |
请参见:
![]() |
使用DocCommentXchange讨论此页。
|
版权 © 2013, SAP 股份公司或其关联公司. - SAP Sybase SQL Anywhere 16.0 |