Anmelden

View Full Version : SQL - Alternative zu Insert meherer Datensätze in einer Schleife?



Dominic K.
14-09-16, 15:41
Moin : ),

ich habe folgende Problemstellung:

Ich habe hier ein RPG Programm, dieses verwaltet die Geräte unsere Kunden.
Nun soll eine Funktion implementiert werden die per F-Key einem Kunden alle Geräte aus unserer Gerätedb zuordnet.

Nun frage ich mich wie mache ich das am sinnvollsten?

Meine Idee ist bisher ist per Select Into erstmal alle Geräte in einem Array-DS zu speichern, dann in einer DOW Schleife Inserts in die ZuordnungDB Kunde-Gerät zu machen bis das Array einen leeren Eintrag findet (gerätename != ' ').

Das kommt mir aber irgendwie unelegant vor, deswegen würde es mich interessieren ob es dafür eine schönere Möglichkeit gibt. Vllt. weiß ja jemand hier was eleganteres!

Grüße aus dem sonnigen Hamburg
Dominic

dschroeder
14-09-16, 15:59
Ich weiß nicht, wofür du die ArrayDS brauchst. Kannst du nicht einfach einen Cursor über deine GeraeteDB machen?

Also in etwa so:

exec sql declare cursor csr1 select xx_key from GerateDB;
exec sql open csr1

dow sqlcod = 0;
exec sql fetch next from csr1 into :c#_key;
if sqlcod = 0;
insert into zuordnung (hier deine feldnamen) values( :kundennummer, :c#_key)
endif;
enddo;

exec sql close csr;

Dieter

Fuerchau
14-09-16, 16:02
Am einfachsten ist ein:
Insert into MyFiLeA
Select blabla from MyFileB
where ...

dschroeder
14-09-16, 16:04
Noch kürzer wäre es, mit SQL direkt alle Sätze aus der geraeteDB in die zuordung zu schreiben. Ich weiß jetzt nicht die genaue Syntax, aber das müsste so ähnlich aussehen:

exec sql insert into zuordnung select :kundennummer, xx_key from geraeteDB.

Die Frage ist natürlich, ob du in deiner Zuordnungstabelle noch weitere Schlüssel (z.B. eine Record-ID) selbst vergeben musst. Dann könntest du ggf. eine UDF schreiben, die das erledigt.

Dieter

Dominic K.
14-09-16, 16:05
Stimmt, auf die Möglichkeit mit einem Cursoer bin ich wie du siehst gar nicht gekommen >.<
Das ist genau die elegantere Lösung die mir vorschwebte xD Als ich mir meins überlegte hatte dachte ich auch das ist doch irgendwie unnötig so nun weis ich es war so.

Dank dir!

EDIT: Die Lösung von Fuerchau sieht auch gut aus, vllt. sogar noch ein bisschen eleganter, oder?
Auch an dich ein Danke Fuerchau

Fuerchau
14-09-16, 16:11
Zumal der Select zum Inserts ein Fullselect ist, also auch Grouping/Joins/Derivedtables...
Damit lassen sich ganze Datenberge komfortabel umkopieren und verarbeiten.

BenderD
14-09-16, 16:25
Zumal der Select zum Inserts ein Fullselect ist, also auch Grouping/Joins/Derivedtables...
Damit lassen sich ganze Datenberge komfortabel umkopieren und verarbeiten.

... die Eleganz ist allerdings futsch, wenn der insert into select beim 17. Satz von 76 an irgendwas scheitert - ohne Commit geht das schon garnicht!!!

D*B

Fuerchau
14-09-16, 16:48
So kleinlich bin ich da nicht, da meine SQL's dieser Art zu 99,995% nicht scheitern.
Immerhin kann man den Select ja so schreiben, dass z.B. 0-Division nicht auftritt (u.v.m.).

BenderD
14-09-16, 17:16
... wenn der abraucht, dann wegen einer constraint (unique, not null, referential etc.) oder einem Lock - gegen letzteres ist kein Kraut gewachsen und ersteres kann selbst bei maximaler Sorgfalt vorkommen, wenn ein anderer Insert oder ein delete dazwichen funkt.