为什么(SHAPE).SDO_ORDINATES(1)语法失败,而(SHAPE).ST_PointN(1)成功?<



Oracle 18c:


在一个相关的问题中,我们确定:

不支持按索引提取集合元素的语法在SQL .

所以使用这种语法的查询将失败:(shape).sdo_ordinates(1)

select
(shape).sdo_ordinates(1) as startpoint_x
from
(select sdo_geometry('linestring(1 2, 3 4, 5 6)') as shape 
from dual)
Error:
ORA-00904: "MDSYS"."SDO_GEOMETRY"."SDO_ORDINATES": invalid identifier

来源:为什么SHAPE.SDO_ORDINATES(1)在PL/SQL中工作,而在SQL中不工作?


然而,我有一个类似的查询(不同的数据类型),当我使用看似相似的语法时成功:(shape).st_pointn(1).

select
(shape).st_pointn(1) as startpoint
from
(select treat(st_geometry.from_wkt('Linestring(1 2, 3 4, 5 6)',26917) as st_linestring) as shape
from dual)
Result:
MDSYS.ST_POINT(MDSYS.SDO_GEOMETRY(2001, 26917, MDSYS.SDO_POINT_TYPE(1, 2, NULL), NULL, NULL))

来源:为什么我们需要Treat() MDSYS。ST_GEOMETRY作为ST_LINESTRING使用ST_PointN(1)?


为什么(SHAPE).SDO_ORDINATES(1)失败,(SHAPE).ST_PointN(1)成功?

[TL;DR]

SDO_ORDINATESMDSYS.SDO_GEOMETRY数据类型的集合属性。

ST_POINTNMDSYS.ST_LINESTRING数据类型(超类型)的成员函数


当你使用:

select sdo_geometry('linestring(1 2, 3 4, 5 6)').sdo_ordinates(1)
from   dual

如果SQL引擎将语法处理为对object_type.member_function(argument)形式的成员函数的调用,并且没有SDO_GEOMETRY数据类型的SDO_ORDINATES成员函数,则输出为:

ORA-00904: "MDSYS"."SDO_GEOMETRY"."SDO_ORDINATES": invalid identifier

因为MDSYS.SDO_GEOMETRY对象上没有SDO_ORDINATES成员函数


如果您使用:

select (sdo_geometry('linestring(1 2, 3 4, 5 6)').sdo_ordinates)(1)
from   dual

然后SQL引擎将语法处理为(object_type.collection_attribute)(index),输出为:

ORA-03001: unimplemented feature

因为SQL中不支持提取集合元素

最后

:

select treat(
st_geometry.from_wkt('Linestring(1 2, 3 4, 5 6)',26917)
as st_linestring
).st_pointn(1)
from   dual

返回一个ST_LINESTRING对象类型,然后用参数1调用ST_POINTN成员函数。这是因为在MDSYS.ST_CURVE上声明了ST_POINTN成员函数,该成员函数是MDSYS.ST_LINESTRING的超类型。

你可以使用:

查看对象的源
select text
from   all_source
where  type  = 'TYPE'
and    owner = 'MDSYS'
and    name  = 'ST_LINESTRING'
ORDER BY line

然后,对于它的父元素:

select text
from   all_source
where  type  = 'TYPE'
and    owner = 'MDSYS'
and    name  = 'ST_CURVE'
ORDER BY line

包含声明:

MEMBER FUNCTION ST_PointN(aposition INTEGER) RETURN ST_Point DETERMINISTIC,

db<此处小提琴>

最新更新