Скопируйте значения вложенной таблицы в другой кортеж из той же таблицы - PullRequest
0 голосов
/ 02 сентября 2018

У меня есть следующая таблица в оракуле 11g с именем parlamentari:

ср varchar (16) ном варчар (20) когном варчар (20) telefoni telefoni_NT

где telefoni_NT - вложенная таблица varchar2. Теперь я должен скопировать элементы вложенной таблицы кортежа (sorgente) в другой кортеж (ricevente). Я пытаюсь написать пример

Стартовая ситуация

parlamentari
-------------------------------------
cf | nome | cognome | telefoni 
-------------------------------------
 1 |   a  |    aa   |  VARCHAR(222,444)
 2 |   b  |    bb   |  VARCHAR(111)

Ситуация после вызова процедуры

parlamentari
-------------------------------------
cf | nome | cognome | telefoni 
-------------------------------------
 1 |   a  |    aa   |  VARCHAR(222,444)
 2 |   b  |    bb   |  VARCHAR(111, 222, 444)

Я пытался написать эту процедуру безуспешно

create or replace procedure copia_telefoni2
(sorgente in parlamento2018.parlamentari.cf%type,
 ricevente in parlamento2018.parlamentari.cf%type) as

cursor cur_out_tel is 
  select column_value as original_list 
  from parlamentari, table(telefoni)
  where cf = sorgente
 ;

cursor in_parlamentare is 
  select column_value as copied_list 
  from parlamentari, table(telefoni)
  where cf = destinazione;

begin

  if (sorgente <> destinazione) then

    for i in cur_out_tel loop
      dbms_output.put_line(i.original_list);

          insert into table(select telefoni from parlamentari where cf=destinazione) values (telefoni_nt(i.original_list));

    end loop;
  else
    dbms_output.put_line('Errore! Sorgente e destinazione uguali');
  end if;

end copia_telefoni2;

1 Ответ

0 голосов
/ 04 сентября 2018

Копировать значения вложенной таблицы в другой кортеж из той же таблицы

Насколько я мог понять ваше требование, вам не нужно insert в table, так как запись уже существует в вашей таблице. Все, что вам нужно, это обновить существующую запись. Поскольку ваш столбец таблицы - это таблица nested, MULTISET UNION - это то, что будет работать в вашей ситуации. Смотрите демо ниже:

Таблица:

CREATE OR REPLACE TYPE telefoni_nt IS TABLE OF VARCHAR2(100);

CREATE TABLE parlamentari (
    cf         VARCHAR(16),
    nome       VARCHAR(20),
    cognome    VARCHAR(20),
    telefoni   telefoni_nt
)
NESTED TABLE telefoni STORE AS nested_telefoni;

insert into parlamentari values('1','a','aa',telefoni_nt('VARCHAR(222,444)'));

insert into parlamentari values('2','b','bb',telefoni_nt('VARCHAR(111)'));

Выход:

SQL> Select CF ,TELEFONI from parlamentari;

        CF           TELEFONI
        --           ------
        1            TELEFONI_NT('VARCHAR(222,444)')
        2            TELEFONI_NT('VARCHAR(111)')

Процедура:

CREATE OR REPLACE PROCEDURE copia_telefoni2 (
    sorgente       IN parlamentari.cf%TYPE,
    destinazione   IN parlamentari.cf%TYPE
) AS

BEGIN
    IF ( sorgente <> destinazione )        
    THEN    
            --Using MULTISET Operator to merge the destination column element with the source column elements.
            UPDATE parlamentari
                SET
                    telefoni = telefoni MULTISET UNION (SELECT telefoni 
                                                        FROM parlamentari 
                                                        WHERE cf = sorgente )
            WHERE
                cf = destinazione;
    ELSE
        dbms_output.put_line('Errore! Sorgente e destinazione uguali');
    END IF;
COMMIT;
END copia_telefoni2;
/

Исполнение:

SQL> EXEC copia_telefoni2('1','2');

 PL/SQL procedure successfully completed.

Результат:

SQL> Select CF ,TELEFONI from parlamentari;

            CF           TELEFONI
            --           ------
            1            TELEFONI_NT('VARCHAR(222,444)')
            2            TELEFONI_NT('VARCHAR(111)','VARCHAR(222,444)')

В результате вы можете видеть, что две строки теперь объединены.

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