INSERT-und UPDATE eines Datensatzes mittels Cursor in oracle
Ich habe 2 Tabellen- student
und studLoad
beide haben 2 Felder studID
und studName
. Ich möchte zum laden von Daten aus student
Tabelle in stuLoad
Tabelle.
Wenn die Daten bereits vorhanden sind, in die studLoad
Tabelle, dann sollte es aktualisiert werden, sonst kommt es eingefügt werden soll. Folgendes ist mein code dazu:
create or replace procedure studentLoad is
v_id student.studID%type;
v_name student.studName%type;
v_sn studLoad.studName%type;
cursor cur_load is
select * from student;
begin
open cur_load;
loop
fetch cur_load into v_id,v_name;
exit when cur_load%notfound;
select studName into v_sn from studLoad where studID = v_id;
if(v_sn!= v_name) then
update studLoad set studName= v_name where studID= v_id;
else
insert into studLoad values(v_id,v_name);
dbms_output.put_line(v_id || ' ' || v_name);
end if;
end loop;
close cur_load;
end;
Funktioniert es nicht. die Zeilen in studLoad-Tabelle nicht aktualisiert. Wie kann ich dieses Problem lösen? In SQL server verwenden wir IF EXISTS(select...from stuLoad..)
um zu überprüfen, ob der Datensatz in der Tabelle vorhanden, gibt es eine Möglichkeit, das gleiche zu tun in Oracle? wenn ja, dann bitte lassen Sie mich wissen, die gleichen.
Dein code funktioniert nicht gut, weil es nicht das tut, was du redest. Ich bin überrascht, warum es nicht Ausnahmen. NO_DATA_FOUND-Ausnahme im Fall nicht übereinstimmender Datensätze. Die IF-Bedingung zu evaluieren, wenn es der Fall ist, zum einfügen der Datensätze ist falsch, denn es würde einfügen nur neue Duplikate. Ben vorgeschlagene Lösung würde funktionieren, wenn studId ist einzigartig in beide studLoad und Schüler Tabellen.
InformationsquelleAutor z22 | 2012-08-12
Du musst angemeldet sein, um einen Kommentar abzugeben.
Dies ist ein sehr ineffizienter Weg, es zu tun. Sie können die
merge
Anweisung und dann gibt es keine Notwendigkeit für Cursor, Loop-Funktion oder (wenn Sie das tun können ohne) PL/SQL.Stellen Sie sicher, dass Sie
commit
sobald diese abgeschlossen ist, um in der Lage sein zu sehen, diese in der Datenbank.Tatsächlich Ihre Frage zu beantworten, ich würde es tun, etwas wie folgt. Dies hat den Vorteil, das tun die meisten der Arbeit in SQL und nur Aktualisierung auf der Grundlage der rowid, eine einzigartige Adresse in der Tabelle.
Es erklärt, eine Art, die Sie in den Daten, in der Masse, 10.000 Zeilen zu einer Zeit. Dann verarbeitet diese Zeilen individuell.
Als ich jedoch sagen, das wird nicht so effizient wie
merge
.danke Kumpel...merge-Lösung funktionierte für mich!
Sie sind natürlich richtig. Ich habe aktualisiert es.
sehen pls den thread stackoverflow.com/questions/11924657/merge-when-matched-insert . ich wünschte, zu führen Konstruktive laden. wie mache ich das mit Zusammenführen?
wie rufe ich diese Zusammenführen eingefügten code in eine Prozedur? beginnen proc_name; end; funktioniert nicht hier
InformationsquelleAutor Ben