Как вставить данные нескольких столбцов в таблицу, содержащую один столбец, используя курсор в pl / sql? - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь вставить данные из таблицы 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 голосов
/ 05 ноября 2018

Ваш столбец в таблице 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 для получения подробной информации о системном конструкторе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...