有一个ORACLE表,里面有201列,第一列是时间(datetime),从第2列到201列是温差 格式是temp_1 temp_2 temp_3 一直到temp_200,共有12898行数据。其中一个时间点对应一条数据。现在表结构发生了改变,新的表只有三列,时间datetime,房间号room_num(房间号是从1到200),温度差hl_temp,温度差hl_temp的值对应原来表当中温差值。现在要求 新的表一个时间点对应200条数据了,即分别对应原先表中200个温差的值,房间号为1的温度差(hl_temp)的值对应原表中temp_1的值,房间号为2的温度差(hl_temp)的值对应原表中temp_2的值,以此类推,房间号为200的的温度差(hl_temp)的值对应原表中temp_200的值。即原来有 201列,12898行,现在要求转换为 3列 datetime,room_num,hl_temp,12898*200行的表,请教高手赐教,如何CODE.万分感谢,高手赐教。

解决方案 »

  1.   

    房间号room_num在老表中并不存在呀?该如何取得?是通过temp_1中的1来获得吗?
      

  2.   

    如果我上述推断为真,那么有2种方法解决这个问题。
    方法一:通过手工写SQL来实现,不过这个方法很笨:INSERT INTO NEWTABLE(SELECT 1,DATETIME,temp_1 FROM OLDTABLE );
    INSERT INTO NEWTABLE(SELECT 2,DATETIME,temp_2 FROM OLDTABLE );
    ...
    INSERT INTO NEWTABLE(SELECT 200,DATETIME,temp_200 FROM OLDTABLE );方法2,通过存储过程及游标循环来实现。
      

  3.   

    方法2存储过程的代码,其中TEST表为你的老表,TEST2是你建立的新表
    TEST2的建表语句为CREATE TABLE TEST2(DATETIME DATE,ROOM NUMBER,TEMP VARCHAR2(20))--存储过程代码
    CREATE OR REPLACE PROCEDURE TEST99 IS 
    I INTEGER;
    STRTEMP VARCHAR2(20);
    STRTEMP1 VARCHAR2(20);
    STRSQL VARCHAR2(4000); 
    BEGIN
         STRTEMP:='TEMP_';
         I:=1;
         WHILE I<201 LOOP
         BEGIN
         STRTEMP1:=STRTEMP||I;
         STRSQL:='INSERT INTO TEST2(SELECT DATETIME,'||I||','||STRTEMP1||' FROM TEST)';
         EXECUTE IMMEDIATE STRSQL;
         I:=I+1;
         END;
         END LOOP;
         COMMIT;
    END;
      

  4.   

    declare 
            v_sql varchar2(800);
    begin
      FOR i IN 1..200 LOOP  
       v_sql := ' insert into new_table select column1, ' || i || ', temp_'||i ||' from old_table';
       execute immediate v_sql;
       commit;
      END LOOP;
    end;