将 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