我在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;
答案 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)')
因此您可以在结果中看到两行已合并。