Verwenden Sie Cursor-variable einfügen, mit einer Schleife in einer Prozedur speichern
Ich habe eine Prozedur speichern, und ich brauche, um alle ids von einer Tabelle, und fügen Sie neue Zeilen in eine andere Tabelle mit dieser ids die ich aber nicht gut verstehen, die Funktion cursor
PROCEDURE INSERTMDCGENERAL AS
idCat NUMERIC;
CURSOR cur IS
SELECT ID_CAT_FILTROS_TALENTO into idCat FROM MDC_CAT_FILTROS_TALENTO;
BEGIN
FOR v_reg IN cur LOOP
INSERT INTO MDC_FILTROS_TALENTO(ID_FILTRO,ID_CAT_FILTROS_TALENTO)
VALUES(SEC_MDC_FILTROS_TALENTO.NextVal,idCat);
END LOOP;
COMMIT;
END INSERTMDCGENERAL;
- Warum verwenden Sie einen cursor? Fügen Sie einfach Ihre select-Anweisung...
- Es gibt zu viele Zeilen in der Tabelle MDC_CAT_FILTROS_TALENTO, ich habe gelesen, dass ich kann verwenden Sie cursor zu gehen, werfen alle Datensätze
- Ein cursor wird viel langsamer, weil Sie haben, es zu Bearbeiten, Zeile für Zeile. Wenn Sie haben, um es zu teilen, dann so etwas wie BULK COLLECT auf die parallele Verarbeitung besser wäre. Überlegen Sie, ob Sie wirklich tun dies aber nicht. Wie viele Datensätze sind in der Tabelle und wie lange dauert der standard-insert nehmen?
- Sie werden tun eine Menge der einzelnen Einsätze, welche nur langsamer sein als eine einzelne
insert ... select
. Wenn Sie aus der rollback - /undo mit einem einzigen insert (alle kann ich denke, du meinst mit 'zu groß'), dann wird das nicht helfen, wie es ist; Sie kann geändert werden, um zu vermeiden dieses problem, aber es wäre ein patch, der deine DB so groß sein sollte mit der Arbeit zu tun Sie brauchen, es zu tun.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist selten sinnvoll, etwas komplexer als:
Diese Arbeit sollte in den meisten Fällen. Nur, wenn Sie den Umgang mit Millionen von Zeilen ist es wahrscheinlich, dass Sie brauchen, um zu verschönern dieses. Auch dann sollten Sie nicht verwenden einer cursor-Schleife und Zeile-Für-Zeile verarbeiten: das ist weitaus ineffizienter.
Könnte dies sein, was Sie erwarten...