使用动态表声明rowtype的类型表

时间:2016-10-05 06:55:37

标签: oracle dynamic types

我有一个暂时存储数据的临时表TEMP_TABLE1&最后合并到主表。我使用它作为不同结构的多个目标表的公共表。

 COL1               VARCHAR2(2000)
 COL2               VARCHAR2(2000)
 COL3               VARCHAR2(2000)
 COL4               VARCHAR2(2000)
 COL5               VARCHAR2(2000)
 COL6               VARCHAR2(2000)
 COL7               VARCHAR2(2000)
 COL8               VARCHAR2(2000)
 COL9               VARCHAR2(2000)
 COL10              VARCHAR2(2000)
 COL11              VARCHAR2(2000)
 COL12              VARCHAR2(2000)
 ..
 COL40              VARCHAR2(2000)
 COL41              DATE
 COL42              DATE

现在我需要插入但丢弃一些不需要/错误的行。 所以我现在有一个示例目标表的以下工作代码。

declare
  type l_array is table of TEMP_TABLE3%rowtype;
       l_rec_data l_array;
       l_sql      VARCHAR2(200);
       l_start    NUMBER:=1;
       j NUMBER;
 begin
        l_sql := 'select COL1,COL2,COL3,COL4,COL5 FROM TEMP_TABLE1';
        execute immediate l_sql bulk collect into l_rec_data;
        DBMS_OUTPUT.PUT_LINE(l_rec_data.COUNT);
        begin 
        loop 
         begin 
          forall i in l_start .. l_rec_data.count 
          insert into TEMP_TABLE3 (COL1,COL2,COL3,COL4,COL5) values ( l_rec_data(i).COL1,l_rec_data(i).COL2,l_rec_data(i).COL3,l_rec_data(i).COL4,l_rec_data(i).COL5); 
          EXIT; 
          exception 
            when DUP_VAL_ON_INDEX THEN
            dbms_output.put_line( 'DUP_VAL_ON_INDEX row index = ' || (l_start+sql%rowcount) ||  ' ' || sqlerrm ); 
            j:=l_start+sql%rowcount;
            UPDATE TEMP_TABLE3 SET COL2=l_rec_data(j).COL2, COL3=l_rec_data(j).COL3, COL4=l_rec_data(j).COL4, COL5=l_rec_data(j).COL5 WHERE COL1=l_rec_data(j).COL1;
            l_start := l_start + 1; 
            when others then 
            dbms_output.put_line( 'Bad row index = ' || (l_start+sql%rowcount) ||  ' ' || sqlerrm ); 
            l_start := l_start + sql%rowcount + 1; 
          end; 
         end loop; 
         end;
END;

但是,我想为各种表动态声明l_array。 例如:我可能想将l_array声明为(TEMP_TABLE3%rowtype - 几行)的表格,如下所示:

type l_array is table of TABLE(COL1,COL2,COL3,COL4)%rowtype; 

0 个答案:

没有答案