将嵌套表的值复制到同一表的另一个元组中

时间:2018-09-02 02:00:42

标签: oracle11g nested

我在oracle 11g中有一个名为parlamentari的表:

  

cf varchar(16)   Nome varchar(20)   cognome varchar(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 :(得分:1)

  

将嵌套表的值复制到同一表的另一个元组中

据我所知,您不需要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)')

因此您可以在结果中看到两行已合并。