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_ORDINATES
是MDSYS.SDO_GEOMETRY
数据类型的集合属性。
ST_POINTN
是MDSYS.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<此处小提琴>此处小提琴>