gabrixl
Goto Top

SQL PL - SELECT INTO (var) in INSERT INTO einbauen um aktuelle Zeile abzurufen

Hallo zusammen

Ich würde gern ein SELECT INTO in einem "INSERT INTO" einbauen, damit ich einen Wert holen kann der sich auf die aktuelle Zeile bezieht.

Mir ist bewusst das ein INSERT INTO Statement jedes mal alle Daten die der Bedingung zutreffen in die Zieltabelle schreibt. Nun frage ich mich ob es eine Möglichkeit gibt das INSERT INTO Zeilenweise durchzuführen?

Ich hab das ganze in einem Codebeispiel ein wenig verständlicher dargestellt wie ich das gern haben möchte... Das INSERT INTO sollte in dem Fall durch ein Statement ersetzt werden, welches die Daten Zeilenweise in die Zieltabelle schreibt und die Sourcezeile dann ändert, wenn die Zeile oft genug durchgearbeitet wurde (i = c).

CREATE OR REPLACE PROCEDURE test_cr_we_lndlc
IS
   i     NUMBER;
   c     NUMBER;
   row   NUMBER;
BEGIN
   row := 1;
   
   LOOP   -- LOOP für einzelne Zeilen von Quelltabelle
      i := 1;


      LOOP                                   -- LOOP falls eine Zeile aus der Quelltabelle mehrmals durchgeführt werden soll
         INSERT INTO cr_we_lndlc (wareneingang_id, lndlc_id, buchdat)
            SELECT cw.wareneingang_id, cl.lndlc_id, cw.buchdat
              FROM cr_wareneingang.ROW cw                               -- .Row gibt an welche Zeile aktuell verarbeitet wird
                   LEFT JOIN cr_lndlc cl
                      ON (    cl.CODE = REGEXP_SUBSTR (cw.dlcode, '\D', i)  
                          AND cl.EXTID = REGEXP_SUBSTR (cw.dlcode, '\d+', i));  

         SELECT REGEXP_COUNT (dlcode, '\D') INTO c FROM cr_wareneingang.ROW;                -- Anhand aktueller Zeile wird Wert c festgelegt  



         i := i + 1;
         EXIT WHEN i = c;
      END LOOP;

      row := row + 1;
   END LOOP;
END;

Die Prozedur soll anhand der Anzahl Buchstaben im Datenfeld von der Spalte 'CODE' den Loop mehrfach durchführen.

Hoffe es ist genug verständlich..

Bin für jede Hilfe Dankbar


Gruss gabrixl

Content-ID: 346248

Url: https://administrator.de/contentid/346248

Ausgedruckt am: 23.11.2024 um 21:11 Uhr

ukulele-7
ukulele-7 14.08.2017 um 13:31:21 Uhr
Goto Top
Ich verstehe dein Problem noch nicht ganz, das ist MySQL richtig?

Hast du mal getestet welchen Rückgabewert die MySQL Funktion für das aktuelle Datum liefert bei einem INSERT, der etwas Zeit in Anspruch nimmt? Meines erachtens müsste in der Spalte auch immer der richtige Zeitwert stehen.
gabrixl
gabrixl 14.08.2017 um 14:07:57 Uhr
Goto Top
Arbteite mit Toad for Oracle SQL/PL

Das Problem ist das ich den Wert (SELECT REGEXP_COUNT (dlcode, '\D') INTO c FROM cr_wareneingang) von jeder Zeile aus der Quelltabelle (cr_wareneingang) brauche, da aber INSERT INTO alles in einem durchrattert müsste ich ja theoretisch das (SELECT REGEXP_COUNT (dlcode, '\D') INTO c FROM cr_wareneingang) in das INSERT INTO einbinden, was aber nicht funktioniert (meine Annahme anhand Internet Recherche). Jetzt ist meine Frage ob es ein Befehl gibt welcher mir gescheit Zeile für Zeile aus der Quelltabelle (cr_wareneingang) durchgeht und bei jeder einzelnen Zeile diesen Befehl (SELECT REGEXP_COUNT (dlcode, '\D') INTO c FROM cr_wareneingang) durchgeführt wird (Da der Wert der Variable "c" bei jeder Zeile unterschiedlich sein kann).

Der Code welcher oben steht soll nur ein Beispiel sein wie ich mir das ca. vorstelle, meine Frage ist ob es da eine gescheite Lösung dazu gibt.

Kurzgefasst: Gibt es ein Befehl welcher ein Insert macht (ähnlich wie INSERT INTO mit direkter Quell und Source Angabe), dies aber Zeile für Zeile durcharbeitet wie z.B. in einer FOR EACH Schlaufe oder sowas ähnliches.
ukulele-7
ukulele-7 14.08.2017 um 14:26:10 Uhr
Goto Top
Ich bin in Oracle nicht fit aber es müsste eigentlich genau laufen wie in MSSQL oder MySQL:

INSERT INTO tabelle(spalte,berechnete_spalte)
SELECT spalte,REGEXP_COUNT(dlcode, '\D') FROM cr_wareneingang
MadMax
Lösung MadMax 15.08.2017 um 12:43:34 Uhr
Goto Top
Hallo gabrixl,

mir geht es zwar ähnlich wie ukulele, daß ich Dein Problem nicht ganz verstehe und meine Oracle-Zeiten sind auch schon ein paar Jahre her.

Aber wenn Du eine Tabelle zeilenweise wie in einer Schleife abgearbeitet haben willst, dann suchst Du möglicherweise etwas, das sich Cursor nennt. In SQL Server geht das dann in der Art: "declare xy cursor for select Spalte from Tabelle where Bedingung order by Sortierung". In Oracle war das auch so ähnlich.

Gruß, Mad Max
gabrixl
gabrixl 17.08.2017 um 10:29:49 Uhr
Goto Top
Danke, Cursor ist das was ich gesucht habe, sorry für die unverständliche Frage...

Gruss gabrixl