如何使用pl / sql中的光标将多列数据插入包含单列的表中?

时间:2018-11-05 16:02:38

标签: oracle plsql

我正在尝试使用游标将表1中的数据插入到另一个表中,目的是了解Oracle中的对象。

但是,在使用游标循环插入数据时出现“ 无效的参数数量”之类的错误。

create type airport_t as object
 (
     Rank number,
     Airport varchar2(80),
     Location varchar2(60),
     Country varchar2(50),
     Code_iata varchar2(3),
     Code_icao varchar2(4),
     Total_Passenger number,
     Rank_change number,
     Percent_change number
  );


   create table AIRPORTS2017OO
   (
       AIRPORT airport_t   // Look above code..
    );


    declare
    cursor insert_cr is select * from AIRPORTS2017;
    begin
       open insert_cr;
       for i in insert_cr  
       loop
           insert into Airports2017oo values( airport_t(i.Rank || '    
            '||i.airport ||'    '||
             i.Location ||'    '|| i.Country ||'    '|| i.code_iata ||'  '|| 
            i.code_icao ||'   '||
         i.Total_Passenger ||'   '|| i.Rank_change ||'    '|| 
         i.Percent_change));
        end loop;

       end;
        /

表1包含50行9列。但是,表2只有1列,我只希望表1中的所有数据进入表2中的单列。

错误图片: [1]

1 个答案:

答案 0 :(得分:0)

您在AIRPORTS2017OO表中的列是AIRPORT_T类型。同时,AIRPORT_T类型具有许多不同类型的参数。但是,在插入行时,您会将所有字段串联到单个字符串中,以作为单个参数传递。您需要将它们作为单独的参数传递,或者将您的对象类型重新定义为具有单个VARCHAR2属性。如果前者是正确的,则应使用以下方法。

DECLARE
   CURSOR insert_cr IS
      SELECT * FROM airports2017;
BEGIN
   FOR i IN insert_cr LOOP
      INSERT INTO airports2017oo
      VALUES
         (airport_t(i.rank
                   ,i.airport
                   ,i.location
                   ,i.country
                   ,i.code_iata
                   ,i.code_icao
                   ,i.total_passenger
                   ,i.rank_change
                   ,i.percent_change));
   END LOOP;

END;
/

此外,有关系统定义的构造函数的详细信息,请参见Oracle Object-Relational Developer's Guide