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



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

CF 瓦尔查尔(16( 诺姆瓦尔查尔(20( 科尼奥姆瓦尔查尔(20( 西班牙电信telefoni_NT

其中telefoni_NT是 varchar2 的嵌套表。 现在,我必须在另一个元组(ricevente(中复制一个元组(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;

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

据我了解您的要求,您无需inserttable,因为记录已存在于您的表中。您所需要的只是更新现有记录。由于您的表列是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)')

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

最新更新