Gewusst wie: einfügen in eine Tabelle korrekt mit Hilfe der Tabelle von Datensätzen und füralle, die in pl/sql
Ich Datensätze eingefügt werden sollen MY_TABLE
mit forall
. Aber die keine. von Datensätzen dat eingefügt wird, hält über die änderung mit jedem test laufen! Ich denke es hat etwas zu tun mit Schleife-Zähler, aber ich bin nicht in der Lage, um herauszufinden. Hier der code-snippet.
DECLARE
TYPE l_rec_type IS RECORD (
datakey SOURCE_TABLE.datakey%TYPE,
sourcekey SOURCE_TABLE.sourcekey%TYPE,
DESCRIPTION SOURCE_TABLE.DESCRIPTION%TYPE,
dimension_name SOURCE_TABLE.dimension_name%TYPE ,
data_type SOURCE_TABLE.data_type%TYPE
);
TYPE l_table_type IS TABLE OF l_rec_typeINDEX BY PLS_INTEGER;
l_table l_table_type;
l_cntr NUMBER;
BEGIN
FOR rec_dimname IN (SELECT dimension_name FROM dimension_table) LOOP
l_cntr1 := 1
FOR rec_source IN (SELECT * FROM source_table WHERE data_type IS NOT NULL) LOOP
l_table(l_ctr1).datakey := rec_source.datakey;
l_table(l_ctr1).sourcekey := rec_source.sourcekey;
l_table(l_ctr1).DESCRIPTION := rec_source.DESCRIPTION;
l_table(l_ctr1).dimension_name := rec_source.dimension_name;
l_table(l_ctr1).data_type := rec_source.data_type;
l_cntr1 := l_cntr1+1;
END LOOP
FORALL j IN l_table.FIRST..l_table.LAST
INSERT INTO my_table VALUES(l_table(j).datakey,
l_table(j).sourcekey,
l_table(j).DESCRIPTION,
l_table(j).dimension_name,
l_table(j).data_type,
1,
SYSDATE,
login_id
);
END LOOP;
END;
Was mache ich falsch? Normal insert mit for-Schleife einfügen 5000 Datensätze. Ein weiteres problem, das ich bin vor ist, wie Sie zu behandeln, WENN DUP_VAL_ON_INDEX und WENN ANDERE Ausnahme durch Verwendung von forall. In nornal for-Schleife einfach. Aber ich FORALL, die für schnelle Einsätze. Bitte um Hilfe!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Blick auf deinen code kann ich sehen, dass Sie nicht löschen Sie die gespeicherten Daten in der pl/Tabelle in der Schleife, und Sie haben nicht ein
order by
zu Ihrer Abfrage. Also, wenn die erste iteration mehr Daten haben, dann die zweite haben Sie doppelte Daten.Also nach der Initialisierung
l_cntr1
var (l_cntr1 := 1
) Sie müssen klar Ihre pl/Tabelle:Hoffe, das hilft.
l_table.delete
arbeitete wie ein Charme.. danke für die HilfeHier ist der Feste code. Plus SPAREN AUSNAHMEN wirklich meinen Tag gerettet!. Hier ist, wie ich die Lösung implementiert. Ich danke Ihnen allen für Ihre wertvolle Zeit und Ihre Anregungen.
Ihre zu sein scheinen einlegen genau das gleiche mehrere Male - du bist allein die Schleife durch die
count
vondimension_table
, was bedeutet, es kann vereinfacht werden auf die folgenden, was schneller geht. An der Unterseite ist einforall
version.Können Sie nicht verwenden
exception when dup_val_on_index
mit entweder version, die Sie haben, es zu tun, Zeile für Zeile. Beurteilen allein durch das was du gepostet hast vermute ich, dass Sie tatsächlich das erreichen, was Sie versuchen zu tun, in einer einzigen Abfrage, und speichern Sie alle dieses problem vollständig ( einschließlich Umgang mit doppelte Werte ).Wenn Sie jedoch wirklich wollen, zu verwenden
forall
können Sie etwas wie das hier tun:bulk collect
mit dem, was du tust in dem moment, Sie wählen direkt aus einem cursor. Wenn Sie zum aktualisieren von Werten in Ihrer Art, Sie können immer nochbulk collect
! Was ist Ihre eigentliche problem?l_table.delete
gearbeitet.