与表对象交叉联接会传播行(不需要 Table() 函数)

Cross-joining with a table object propagates rows (without needing Table() function)

提问人:User1974 提问时间:6/12/2022 最后编辑:User1974 更新时间:6/18/2022 访问量:100

问:

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()


相关:

SQL Oracle18C Oracle 空间 对象类型

评论


答:

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 语法图中。它看起来是一个未记录的(或记录非常少的)功能。