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

Oracle11g 将嵌套表的值复制到同一表的另一个元组中,oracle11g,nested,Oracle11g,Nested,我在oracle 11g中有一个名为parlamentari的下表: cf varchar16 诺姆·瓦尔查尔20 cognome varchar20 telefoni telefoni\n 其中telefoni\n NT是一个varchar2嵌套表。 现在,我必须在另一个元组ricevent中复制一个元组sorgente的嵌套表的元素。 我试着写一个例子 起始情况 parlamentari ------------------------------------- cf | nome | co

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

cf varchar16 诺姆·瓦尔查尔20 cognome varchar20 telefoni telefoni\n

其中telefoni\n NT是一个varchar2嵌套表。 现在,我必须在另一个元组ricevent中复制一个元组sorgente的嵌套表的元素。 我试着写一个例子

起始情况

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;
将嵌套表的值复制到同一表的另一个元组中

据我所知,您不需要在表中插入,因为记录已经存在于您的表中。您只需更新现有记录。因为您的表列是嵌套表,所以在您的情况下,这是一种可行的方法。请参阅下面的演示:

表:

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> Select CF ,TELEFONI from parlamentari;

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

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

感谢您的解决方案。关于这个问题,我还有一个问题。如果我想使用cast运算符,我知道该运算符是谁?cast将抛出错误或不一致的数据类型,因为您正在尝试更新列而不是集合。但是telefoni可以被视为集合吗?是的,它是集合,但在这种情况下,它只是不起作用-
SQL> Select CF ,TELEFONI from parlamentari;

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