Select 来自同一类型的多个 PL/SQL 个集合
Select from multiple PL/SQL collections of the same type
有类型
CREATE OR REPLACE TYPE DATE_RANGE IS OBJECT (
STARTDATE DATE,
ENDDATE DATE
);
CREATE OR REPLACE TYPE DATE_RANGES_T IS TABLE OF DATE_RANGE;
和 table 每行收集
---------------------------------------------------------
| COLUMN
---------------------------------------------------------
ROW | DATE_RANGES_T(
| DATE_RANGE(DATE '2021-01-01',DATE '2021-01-02'),
| DATE_RANGE(DATE '2021-01-03',DATE '2021-01-04'),
| DATE_RANGE(DATE '2021-01-05',DATE '2021-01-06')
| )
---------------------------------------------------------
ROW | DATE_RANGES_T(
| DATE_RANGE(DATE '2021-01-07',DATE '2021-01-08'),
| DATE_RANGE(DATE '2021-01-09',DATE '2021-01-10')
| )
---------------------------------------------------------
ROW | DATE_RANGES_T(
| DATE_RANGE(DATE '2021-01-11',DATE '2021-01-12')
| )
---------------------------------------------------------
是否可以 select 所有 date_range 的对象从这个 table 到那样的结果集?
DATE_RANGE(DATE '2021-01-01',DATE '2021-01-02')
DATE_RANGE(DATE '2021-01-03',DATE '2021-01-04')
DATE_RANGE(DATE '2021-01-05',DATE '2021-01-06')
DATE_RANGE(DATE '2021-01-07',DATE '2021-01-08')
DATE_RANGE(DATE '2021-01-09',DATE '2021-01-10')
DATE_RANGE(DATE '2021-01-11',DATE '2021-01-12')
像这样
WITH TT AS (
SELECT DATE_RANGES_T(
DATE_RANGE(DATE '2021-01-01',DATE '2021-01-02'),
DATE_RANGE(DATE '2021-01-03',DATE '2021-01-04'),
DATE_RANGE(DATE '2021-01-05',DATE '2021-01-06')
) DT FROM DUAL
UNION ALL
SELECT DATE_RANGES_T(
DATE_RANGE(DATE '2021-01-07',DATE '2021-01-08'),
DATE_RANGE(DATE '2021-01-09',DATE '2021-01-10')
) FROM DUAL
UNION ALL
SELECT DATE_RANGES_T(
DATE_RANGE(DATE '2021-01-11',DATE '2021-01-12')
) FROM DUAL
)
SELECT
(SELECT STARTDATE FROM TABLE(DT)), (SELECT ENDDATE FROM TABLE(DT))
FROM TT;
但没有ORA-01427: single-row subquery returns more than one row
错误发生
在 Oracle 数据库 11.2 中
您需要使用TABLE()函数如下:
WITH TT AS (
SELECT DATE_RANGES_T(
DATE_RANGE(DATE '2021-01-01',DATE '2021-01-02'),
DATE_RANGE(DATE '2021-01-03',DATE '2021-01-04'),
DATE_RANGE(DATE '2021-01-05',DATE '2021-01-06')
) DT FROM DUAL
UNION ALL
SELECT DATE_RANGES_T(
DATE_RANGE(DATE '2021-01-07',DATE '2021-01-08'),
DATE_RANGE(DATE '2021-01-09',DATE '2021-01-10')
) FROM DUAL
UNION ALL
SELECT DATE_RANGES_T(
DATE_RANGE(DATE '2021-01-11',DATE '2021-01-12')
) FROM DUAL
)
SELECT T.STARTDATE, T.ENDDATE FROM TT, TABLE(TT.DT) T;
有类型
CREATE OR REPLACE TYPE DATE_RANGE IS OBJECT (
STARTDATE DATE,
ENDDATE DATE
);
CREATE OR REPLACE TYPE DATE_RANGES_T IS TABLE OF DATE_RANGE;
和 table 每行收集
---------------------------------------------------------
| COLUMN
---------------------------------------------------------
ROW | DATE_RANGES_T(
| DATE_RANGE(DATE '2021-01-01',DATE '2021-01-02'),
| DATE_RANGE(DATE '2021-01-03',DATE '2021-01-04'),
| DATE_RANGE(DATE '2021-01-05',DATE '2021-01-06')
| )
---------------------------------------------------------
ROW | DATE_RANGES_T(
| DATE_RANGE(DATE '2021-01-07',DATE '2021-01-08'),
| DATE_RANGE(DATE '2021-01-09',DATE '2021-01-10')
| )
---------------------------------------------------------
ROW | DATE_RANGES_T(
| DATE_RANGE(DATE '2021-01-11',DATE '2021-01-12')
| )
---------------------------------------------------------
是否可以 select 所有 date_range 的对象从这个 table 到那样的结果集?
DATE_RANGE(DATE '2021-01-01',DATE '2021-01-02')
DATE_RANGE(DATE '2021-01-03',DATE '2021-01-04')
DATE_RANGE(DATE '2021-01-05',DATE '2021-01-06')
DATE_RANGE(DATE '2021-01-07',DATE '2021-01-08')
DATE_RANGE(DATE '2021-01-09',DATE '2021-01-10')
DATE_RANGE(DATE '2021-01-11',DATE '2021-01-12')
像这样
WITH TT AS (
SELECT DATE_RANGES_T(
DATE_RANGE(DATE '2021-01-01',DATE '2021-01-02'),
DATE_RANGE(DATE '2021-01-03',DATE '2021-01-04'),
DATE_RANGE(DATE '2021-01-05',DATE '2021-01-06')
) DT FROM DUAL
UNION ALL
SELECT DATE_RANGES_T(
DATE_RANGE(DATE '2021-01-07',DATE '2021-01-08'),
DATE_RANGE(DATE '2021-01-09',DATE '2021-01-10')
) FROM DUAL
UNION ALL
SELECT DATE_RANGES_T(
DATE_RANGE(DATE '2021-01-11',DATE '2021-01-12')
) FROM DUAL
)
SELECT
(SELECT STARTDATE FROM TABLE(DT)), (SELECT ENDDATE FROM TABLE(DT))
FROM TT;
但没有ORA-01427: single-row subquery returns more than one row
错误发生
在 Oracle 数据库 11.2 中
您需要使用TABLE()函数如下:
WITH TT AS (
SELECT DATE_RANGES_T(
DATE_RANGE(DATE '2021-01-01',DATE '2021-01-02'),
DATE_RANGE(DATE '2021-01-03',DATE '2021-01-04'),
DATE_RANGE(DATE '2021-01-05',DATE '2021-01-06')
) DT FROM DUAL
UNION ALL
SELECT DATE_RANGES_T(
DATE_RANGE(DATE '2021-01-07',DATE '2021-01-08'),
DATE_RANGE(DATE '2021-01-09',DATE '2021-01-10')
) FROM DUAL
UNION ALL
SELECT DATE_RANGES_T(
DATE_RANGE(DATE '2021-01-11',DATE '2021-01-12')
) FROM DUAL
)
SELECT T.STARTDATE, T.ENDDATE FROM TT, TABLE(TT.DT) T;