我有這樣的表MYTABLE:
|TS|DAY1|DAY2|...................................|DAY31|
我希望有一個表型別來映射這個表。我怎樣才能做到最好?我想像這樣:
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;
END LOOP;
INSERT INTO MYTABLE
SELECT '01.01.21', f.* FROM TABLE(myVarTable) f;
一切都經過簡化,以向您展示我的意思。對我來說,能夠將一些值放入回圈中的集合,然后立即將所有內容插入到真正的表中,這一點很重要。我可以在 SQL 或 PL/SQL 范圍內完成。
uj5u.com熱心網友回復:
你可以使用:
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<>在這里擺弄
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/331614.html
上一篇:如何忽略SQL中零值的行
下一篇:PostgreSQL中的型別轉換
