PDA

View Full Version : SQL-Funktion mit cpytoimpf-Aufruf



JotSo
17-09-19, 08:51
Vorweg: mein Betriebssystemrelease ist 6.1
Ich möchte in einem SQL-Skript je Mandant eine Datei in jeweils ein Mandantenverzeichnis ins IFS kopieren. Quell-, Zieldatei und Pfad habe ich in einer Datei je Mandant definiert.
So soll das dann ausschauen:
SELECT CopyToIFS(WorkLib, 'V40DEB', WorkFile, ExpTabNam, Pfad) FROM MIGMANDTAB
D.h. ich rufe eine SQL-Function innerhalb eines SELECTs auf die o.g. Mandantendatei auf, welches mir den CPYTOIMPF ausführt.
Da ich in einer Funktion kein CL-Befehl ausführen kann, habe ich mir auf der AS ein CL geschrieben mit diesen 5 Übergabeparametern + cpytoimpf. Dieses CL rufe ich aus einer SQL-Prozedur auf. (Funktion geht leider nicht, da ein CL ja keinen Return-Parameter hat).
Die SQL-Prozedur rufe ich jetzt aus der SQL-Funktion CopyToIFS aus.
Ist zwar ein kleiner Umweg, funktioniert aber, wenn ich nicht gerade einen cpytoimpf im CL aufrufe.
Die Daten werden zwar ins IFS sauber kopiert, dann aber hängt mein Job.
Vermutlich hängt es mit dieser Aussage im Joblog zusammen:
Befehl *LIBL/CPYTOIMPF nicht sicher für Job mit mehreren Threads.
Wird auch durch die Thread-Anzeige des Jobs bestätigt:
Aus- Gesamt- Aux Ausführungs-
wahl Thread Status CPU I/O priorität
000000BA TIMW 0,066 100 20
000000BB THDW 0,017 89 20
Im Aufrufstapel des Thread 000000BB sehe ich u.a. meine Funktion und das CL. Mein Verdacht ist, dass der erste auf die Beendigung des zweiten wartet. Dieser geht aber nicht auf Ende, warum auch immer (vielleicht weil er nicht sicher für Jobs mit mehreren Threads ist?), und deswegen hängt das ganze.
Lt. meiner Jobbeschreibung werden mehrere Threads aber nicht zugelassen. Andererseits steht in meinen Jobausführungsattributen die "Maximale Anzahl Threads" auf *nomax.
Zur Info noch: wenn ich die o.g. Prozedur direkt per Call aufrufe, funzt es! Es scheint also auch mit den mehreren Schichten Skript -> Funktion -> Prozedur -> CL zusammenzuhängen oder allein an der Funktionsschicht.
kann mir jemand sagen:
- wie ich den cpytoimpf multi-thread-fähig bekomme?
- gibt es in SQL eine Option, die bewirkt, nur einen Thread zu öffnen?
- wie ich den 2.Thread beende, damit der 1. weiterläuft?
- gibt es eine Alternative zum cpytoimpf um Daten als csv-Datei ins IFS zu kopieren, die in einem einzigen Thread oder sicher in mehreren Threads läuft?
- fälle jemand zu dem Konstrukt mit Skript -> Funktion -> Prozedur -> CL eine einfachere Alternative ein?

Vielen Dank schon mal für die Unterstützung.

Fuerchau
17-09-19, 14:18
Ich glaube, alle deine Fragen lassen sich da mit "Nein" beantworten.
- CPYTOIMPF bekommst du nicht threadsave
- es gibt keine SQL-Option, die Multithread verbietet
- Es gibt zwar C-Funktionen für Threads, aber in SQL Threads zu killen ist gefährlich
- Eine Alternative kannst du selber schreiben, allerdings nicht in ILE/RPG aber z.B. in Java (ist Threadsave)
- Eine andere Lösung ist eher ein CLP, dass z.B. eine QMQRY-Funktion zum Selektieren der Daten mit Outfile aufruft (QMQRY kann nur 255 Spalten!) um anschließend den CPYTOIMPF aufzurufen.
Alternativ zum QMQRY kann man auch einen RUNSQL mit einem "create table … as select … with data" zusammenklöppeln, mit einem vorherigen DLTF.#

Auch wenn nun Dieter (D*B) nun wieder die Hände über den Kopf schlägt...

Nachtrag:
Statt CLP kann man auch CLLE verwenden, die haben wieder einen Returnwert.
Alternativ gibt es noch die Aufrufkonvention SQL, dann sind NULL-Anzeiger als auch der Returnwert eigene Parameter.