提问人:User1974 提问时间:6/14/2022 最后编辑:User1974 更新时间:6/14/2022 访问量:67
OBJECT_TYPE(...) 在 SELECT 查询中做什么?
What does OBJECT_TYPE(…) do in a SELECT query?
问:
关于相关帖子中的以下查询:将顶点行折叠为嵌套表类型(按 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(...)
答:
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_type
test_array_type
test_array_type
调用 or 是完全相同的过程。您正在调用架构中定义的类型的构造函数,并创建这些类型的实例,并将新实例的属性设置为构造函数的参数。MDSYS.VERTEX_TYPE(...)
MDSYS.VERTEX_SET_TYPE(...)
MDSYS
评论