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

Posted

技术标签:

【中文标题】如何使用 pl/sql 中的游标将多列数据插入包含单列的表中?【英文标题】:How to Insert multiple columns data into table containing single column using cursor in pl/sql? 【发布时间】:2018-11-05 16:02:38 【问题描述】:

我正在尝试使用游标将数据从表 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]

【问题讨论】:

它仍然抛出错误说“数据类型不一致”。那是因为表2只有一列吗?? 【参考方案1】:

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。

【讨论】:

您甚至不需要用于循环的游标,它可以(应该!)在单个 insert-as-select 语句中完成,例如请参阅 livesql.oracle.com/apex/livesql/s/hh5kysr2broe4887p8w3feav5 以获取精简演示。 @Boneist 真的!谢谢你指出。我决定专注于语法问题,而不是深入讨论最佳实践/优化。 知道了.. 感谢您的帮助。 @I_am_Vits 如果有帮助,请接受答案。

以上是关于如何使用 pl/sql 中的游标将多列数据插入包含单列的表中?的主要内容,如果未能解决你的问题,请参考以下文章

PL/SQL 仅使用游标将 2 个表中的数据检索到新表中

PL/SQL-如何使用游标的所有列插入表

将修改后的表中的游标用于相同的 PL/SQL 过程

如何在 PL/SQL 中增量集成数据

如何在 Oracle PL/SQL 过程的开始部分之后声明游标

如何将游标添加到 PL/SQL 块中的过程中?