在oracle中将数据插入到具有不同数据结构的另一个表中

时间:2015-04-01 11:41:34

标签: sql oracle plsql oracle11g

我有一个table table1

ITEM_CODE             DESC       MONTH      DAY01  DAY02  DAY03
FG0050BCYL0000CD     CYL HEAD    FEB-15       0       204   408
FG00186CYL0000CD     POWER UNIT  FEB-15       425    123    202

我想以这种方式从table1中的另一个table2中插入数据。

ITEM_CODE                           MONTH        DATE       QUANTITY
FG0050BCYL0000CD                    FEB-15    01-FEB-2015      0
FG0050BCYL0000CD                    FEB-15    02-FEB-2015      204
FG0050BCYL0000CD                    FEB-15    03-FEB-2015      408
FG00186CYL0000CD                    FEB-15    01-FEB-2015      425
FG00186CYL0000CD                    FEB-15    02-FEB-2015      123
FG00186CYL0000CD                    FEB-15    03-FEB-2015      202

请告诉我如何通过pl sql

实现这一目标

2 个答案:

答案 0 :(得分:2)

这个SQL查询对我有用。

with items as (
  select table1.*, 
      to_date(month||'-01', 'MON-YY-DD', 'NLS_DATE_LANGUAGE=American') day
    from table1)
select item_code, month, day + lvl - 1 day,
    case extract(Day from day + lvl - 1)
      when 1 then day01 
      when 2 then day02
      when 3 then day03    
      -- <- insert rest (day04...day30) here
      when 31 then day31
    end value
  from items
    join (select level lvl from dual connect by level<32) n
      on day + lvl - 1 <= last_day(day)

子查询items将数据的第一天附加到数据中。接下来,我将此子查询与其他分层子查询一起加入, 它给出了31个数字的简单列表(表格1到31)。加入是这样构建的,日期不能超过一个月的最后一天。 因此,对于table1中的每一行,我们有28,29,30或31行具有适当的日期。 现在简单但繁琐的任务 - 每天我们必须从适当的专栏中获得价值;我们需要case。 在解决方案中,这些是四行,但您需要完成休息。

最后只需将结果插入table2。

答案 1 :(得分:1)

以下内容应该让您关闭:

BEGIN
  FOR aRow IN (SELECT * FROM TABLE1)
  LOOP
    INSERT INTO TABLE2(ITEM_CODE, MONTH, "DATE", QUANTITY)
      VALUES (aRow.ITEM_CODE, aRow.MONTH,
              TO_DATE(aRow.MONTH, 'MON-RR')+0, aRow.DAY01);

    INSERT INTO TABLE2(ITEM_CODE, MONTH, "DATE", QUANTITY)
      VALUES (aRow.ITEM_CODE, aRow.MONTH,
              TO_DATE(aRow.MONTH, 'MON-RR')+1, aRow.DAY02);

    INSERT INTO TABLE2(ITEM_CODE, MONTH, "DATE", QUANTITY)
      VALUES (aRow.ITEM_CODE, aRow.MONTH,
              TO_DATE(aRow.MONTH, 'MON-RR')+2, aRow.DAY03);
  END LOOP;
END;

请注意,列名DESCDATE都是Oracle中的保留字,需要引用它们,如上所示。使用不同的名称(例如DESCRIPTIONACTIVITY_DATE)可以更简单,无需在每次使用时引用这些名称。

祝你好运。