Ich muss Daten in eine Tabelle einfügen, die bereits einige Daten enthält, jetzt wird der Tabelle eine neue Spalte hinzugefügt und wir müssen die neue Spalte mit Werten aus einer anderen Tabelle einfügen/aktualisieren.
create table target_tab (fname varchar2(20), acc_no number);
insert into target_tab values('Anybody',121);
insert into target_tab values('Somebody',122);
insert into target_tab values('Nobody',123);
alter table target_tab add sc_vlan varchar2(20);
create table source_tab (rsrc_nm varchar2(20));
insert into source_tab values ('2839_124');
insert into source_tab values('2839_125');
insert into source_tab values('2839_126');
insert into source_tab values('2840_131');
insert into source_tab values('2841_132');
insert into source_tab values('2840_134');
insert into source_tab values('2840_127');
Jetzt müssen wir die Werte der Spalte rsrc_nm von source_tab in die scvlan-Spalte von target_tab einfügen.
Hinweis: Wir haben keine Beziehung zwischen beiden Tabellen und wie wir im Beispiel sehen, dass target_tab weniger Zeilen hat als source_tab, sollten nur Zeilen, die sich in target_tab befinden, mit eindeutigen Werten aus source_tab eingefügt/aktualisiert werden. Wir können jeden Wert von source_tab abrufen.
declare
cursor c_1 is select rsrc_nm
from source_tab
where rownum <= (select count(1)
from target_tab);
type t_tab is table of c_1%rowtype index by pls_integer;
l_tab t_tab;
begin
open c_1;
fetch c_1 bulk collect into l_tab;
for i in 1..l_tab.count
loop
update target_tab set sc_vlan = l_tab(i).rsrc_nm
where sc_vlan is null
and rownum = 1;
commit;
exit when c_1%notfound;
end loop;
close c_1;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(SQLERRM);
dbms_output.put_line(dbms_utility.format_error_backtrace());
end;
Ich denke, Sie könnten so verwenden merge
:
merge into target_tab t
using (
select s.rsrc_nm, t.rwd
from (select row_number() over (order by acc_no) rn, t.*, rowid rwd
from target_tab t) t
join (select row_number() over (order by rsrc_nm) rn, s.*
from source_tab s) s
on t.rn =s.rn
) s
on (t.rowid = s.rwd)
when matched then update set t.sc_vlan = s.rsrc_nm
Sortieren Sie die Daten in beiden Tabellen nach beliebigen Spalten, vergleichen Sie sie mit row_number
und aktualisieren Sie sie.
Dieser Artikel stammt aus dem Internet. Bitte geben Sie beim Nachdruck die Quelle an.
Bei Verstößen wenden Sie sich bitte [email protected] Löschen.
Lass mich ein paar Worte sagen