将 table 映射到集合中
Mapping table into collection
我有 table MYTABLE
这样的:
|TS|DAY1|DAY2|...................................|DAY31|
我希望有一个 table 类型,映射此 table。我怎样才能做到最好?我想到了类似的东西:
CREATE OR REPLACE TYPE DAYS_T IS TABLE OF VARCHAR(250);
CREATE OR REPLACE TYPE MYTYPE_REC AS OBJECT
(
DAY DAYS_T,
TS DATE
);
CREATE OR REPLACE TYPE MYTABLE_T AS TABLE OF MYTYPE_REC;
但我希望,DAY1..DAY31 属于记录。所以我可以这样使用它:
MYTABLE_T myVarTable := MYTABLE_T();
FOR i IN 1 .. 31 LOOP
myVarTable(1)(i) := i;
--....
myVarTable(100)(i) := i;
END LOOP;
INSERT INTO MYTABLE
SELECT '01.01.21', f.* FROM TABLE(myVarTable) f;
一切都经过简化,以向您展示我的意思。对我来说很重要的是能够将一些值放入一个循环中的集合,然后将所有内容立即插入到一个真正的 table 中。我可以在 SQL 或 PL/SQL 范围内完成。
您可以使用:
DECLARE
myVarTable MYTABLE_T := MYTABLE_T();
BEGIN
myVarTable.EXTEND();
myVarTable(1) := MYTYPE_REC( DAYS_T(), DATE '2021-01-01' );
myVarTable(1).day.EXTEND(31);
FOR i IN 1 .. 31 LOOP
myVarTable(1).day(i) := i;
END LOOP;
INSERT INTO MYTABLE (ts, day1, day2, day3, /* ... */ day30, day31 )
SELECT ts,
day1,
day2,
day3,
-- ...
day30,
day31
FROM (
SELECT f.ts,
d.rn,
d.day
FROM TABLE(myVarTable) f
CROSS APPLY (
SELECT ROWNUM AS rn,
COLUMN_VALUE AS day
FROM TABLE(f.day)
) d
)
PIVOT (
MAX(day) FOR rn IN (
1 AS day1,
2 AS day2,
3 AS day3,
-- ...
30 AS day30,
31 AS day31
)
);
END;
/
db<>fiddle here
我有 table MYTABLE
这样的:
|TS|DAY1|DAY2|...................................|DAY31|
我希望有一个 table 类型,映射此 table。我怎样才能做到最好?我想到了类似的东西:
CREATE OR REPLACE TYPE DAYS_T IS TABLE OF VARCHAR(250);
CREATE OR REPLACE TYPE MYTYPE_REC AS OBJECT
(
DAY DAYS_T,
TS DATE
);
CREATE OR REPLACE TYPE MYTABLE_T AS TABLE OF MYTYPE_REC;
但我希望,DAY1..DAY31 属于记录。所以我可以这样使用它:
MYTABLE_T myVarTable := MYTABLE_T();
FOR i IN 1 .. 31 LOOP
myVarTable(1)(i) := i;
--....
myVarTable(100)(i) := i;
END LOOP;
INSERT INTO MYTABLE
SELECT '01.01.21', f.* FROM TABLE(myVarTable) f;
一切都经过简化,以向您展示我的意思。对我来说很重要的是能够将一些值放入一个循环中的集合,然后将所有内容立即插入到一个真正的 table 中。我可以在 SQL 或 PL/SQL 范围内完成。
您可以使用:
DECLARE
myVarTable MYTABLE_T := MYTABLE_T();
BEGIN
myVarTable.EXTEND();
myVarTable(1) := MYTYPE_REC( DAYS_T(), DATE '2021-01-01' );
myVarTable(1).day.EXTEND(31);
FOR i IN 1 .. 31 LOOP
myVarTable(1).day(i) := i;
END LOOP;
INSERT INTO MYTABLE (ts, day1, day2, day3, /* ... */ day30, day31 )
SELECT ts,
day1,
day2,
day3,
-- ...
day30,
day31
FROM (
SELECT f.ts,
d.rn,
d.day
FROM TABLE(myVarTable) f
CROSS APPLY (
SELECT ROWNUM AS rn,
COLUMN_VALUE AS day
FROM TABLE(f.day)
) d
)
PIVOT (
MAX(day) FOR rn IN (
1 AS day1,
2 AS day2,
3 AS day3,
-- ...
30 AS day30,
31 AS day31
)
);
END;
/
db<>fiddle here