提问人:User1974 提问时间:6/12/2022 最后编辑:User1974 更新时间:6/18/2022 访问量:100
与表对象交叉联接会传播行(不需要 Table() 函数)
Cross-joining with a table object propagates rows (without needing Table() function)
问:
Oracle Spatial 有一个称为 SDO_UTIL 的功能。GETVERTICES:
此函数返回 MDSYS 的对象。VERTEX_SET_TYPE,其中 由 MDSYS 的对象表组成。VERTEX_TYPE。
CREATE TYPE vertex_set_type as TABLE OF vertex_type;
该函数通常与函数结合使用。几何表与交叉连接,以传播每个几何的顶点行:GetVertices()
Table()
table(getvertices(shape))
with cte as (
select sdo_geometry('linestring (10 20, 30 40)') shape from dual union all
select sdo_geometry('linestring (50 60, 70 80, 90 100)') shape from dual union all
select sdo_geometry('linestring (110 120, 130 140, 150 160, 170 180)') shape from dual)
select
v.*
from
cte, table(sdo_util.getvertices(shape)) v
X Y Z W V5 V6 V7 V8 V9 V10 V11 ID
----- ----- ----- ----- ----- ----- ----- ----- ----- ----- ----- -----
10 20 1
30 40 2
50 60 1
70 80 2
90 100 3
110 120 1
130 140 2
150 160 3
170 180 4
文档中的示例也建议使用。Table()
但从快速测试来看,使用该功能似乎没有必要。如果我从查询中删除该函数,它会产生相同的结果。table()
Table()
问题:
与表对象交叉联接怎么可能在不需要该函数的情况下传播行?Table()
文档建议我们应该使用该函数,所以我想知道这在旧版本的 Oracle 中是否正确,但也许在新版本中发生了一些变化?Table()
相关:
答:
4赞
MT0
6/12/2022
#1
与表对象交叉联接怎么可能在不需要该函数的情况下传播行?
Table()
在 Oracle 12 或 Oracle 18 中,表集合表达式的关键字成为语法的可选部分,因此:TABLE
SELECT *
FROM TABLE(SYS.ODCIVARCHAR2LIST('a', 'b', 'c'));
适用于所有 oracle 版本(支持集合)。
和:
SELECT *
FROM SYS.ODCIVARCHAR2LIST('a', 'b', 'c');
将在 Oracle 18(也许还有 Oracle 12)上工作并执行完全相同的操作(但在早期版本中会引发语法错误)。
我正在尝试查找新功能的文档,但到目前为止还没有找到。
评论
2赞
MT0
6/13/2022
@User1974 它未在 Oracle 12.2 新功能或 Oracle 18 新功能中明确列出,也不在 Oracle 18 SELECT
语法图中。它看起来是一个未记录的(或记录非常少的)功能。
评论