OBJECT_TYPE(...) 在 SELECT 查询中做什么?

What does OBJECT_TYPE(…) do in a SELECT query?

提问人:User1974 提问时间:6/14/2022 最后编辑:User1974 更新时间:6/14/2022 访问量:67

问:

关于相关帖子中的以下查询:将顶点行折叠为嵌套表类型(按 ID 聚合)

WITH cte (id, x, y) as (
  SELECT 1, 100, 101 FROM DUAL UNION ALL
  SELECT 1, 200, 201 FROM DUAL UNION ALL
  SELECT 2, 300, 301 FROM DUAL UNION ALL
  SELECT 2, 400, 401 FROM DUAL UNION ALL
  SELECT 2, 500, 501 FROM DUAL UNION ALL
  SELECT 3, 600, 601 FROM DUAL UNION ALL
  SELECT 3, 700, 701 FROM DUAL UNION ALL
  SELECT 3, 800, 801 FROM DUAL UNION ALL
  SELECT 3, 900, 901 FROM DUAL
)
SELECT id,
       CAST(
         COLLECT(    --     🡇
           MDSYS.VERTEX_TYPE(x, y, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, id)
           ORDER BY x, y
         )
         AS MDSYS.VERTEX_SET_TYPE
       )
FROM   cte
GROUP BY id

我不熟悉以这种方式使用对象类型:.MDSYS.VERTEX_TYPE(...)

在这种情况下,能取得什么成就?用于构造对象的类型是否类似于构造函数的使用方式?MDSYS.VERTEX_TYPE(...)

SQL Oracle 构造函数 Oracle18C 对象类型

评论

0赞 Damien_The_Unbeliever 6/14/2022
似乎通常不会被复制,因为:“VERTEX_SET_TYPE 和 VERTEX_TYPE 类型仅供 Oracle 使用。
0赞 User1974 6/14/2022
@Damien_The_Unbeliever是的,我已经要求 Oracle Spatial 澄清为什么他们认为这将是一个如此大的问题:为什么我们不应该使用 VERTEX_SET_TYPE 和 VERTEX_TYPE?

答:

1赞 MT0 6/14/2022 #1

在这种情况下,能取得什么成就?用于构造对象的类型是否类似于构造函数的使用方式?MDSYS.VERTEX_TYPE(...)

它是对对象的构造函数的调用,并创建该对象的新实例,其中(假设是默认构造函数)实例的属性设置为构造函数的参数值。

(如果调用的是非默认构造函数,则将创建实例,并根据该构造函数中定义的逻辑初始化属性;在这种情况下,您需要阅读源代码或文档来弄清楚该逻辑是什么。默认构造函数是最简单的,因为它只是按照属性在类型声明中定义的顺序设置属性。


例如:

CREATE TYPE test_type IS OBJECT(
  a VARCHAR2(10),
  b VARCHAR2(10),
  c VARCHAR2(10)
);

CREATE TYPE test_array_type IS TABLE OF test_type;

然后:

test_type('a_value', 'b_value', 'c_value')

调用对象的默认构造函数并设置新实例的:test_type

  • a属性设置为'a_value';
  • b属性为 ;和'b_value'
  • c属性设置为 。'c_value'

如果随后使用:

test_array_type(
  test_type('a1', 'b1', 'c1'),
  test_type('a2', 'b2', 'c2'),
  test_type('a3', 'b3', 'c3')
)

然后你创建 的 3 个实例,这 3 个实例是 的构造函数的参数,将返回一个包含这 3 个元素的实例。test_typetest_array_typetest_array_type


调用 or 是完全相同的过程。您正在调用架构中定义的类型的构造函数,并创建这些类型的实例,并将新实例的属性设置为构造函数的参数。MDSYS.VERTEX_TYPE(...)MDSYS.VERTEX_SET_TYPE(...)MDSYS