PDA

View Full Version : Teildateien per SQL auflisten



Seiten : 1 [2]

Nennewitz
28-06-06, 08:34
execute "call qcmdexc('dspfd myfile ... outfile(qtemp/mymbr)' 0000000nnn.00000)"

nnn = Länge des Commands mit 10 Vorkomma und 5 Nachkomma

Open "Select * from qtemp/mymbr"

Also ich habe jetzt mal versucht die Teildateien der Tabelle GES.S8 in die temporäre Datei GES.KANNWEG auszugeben.

Ich nehme mal an das 'Länge des Commands' bedeutet, wieviel Zeichen zwischen den beiden Hochkomma vorkommen hier also 33. Das "..." habe ich ignoriert.

Mein Versuch war folgender:

CALL QCMDEXC('DSPFD GES.S8 OUTFILE(GES.KANNWEG)' 0000000033.00000)

Alternative habe ich auch die Variante mit / statt . probiert also so:

CALL QCMDEXC('DSPFD GES/S8 OUTFILE(GES/KANNWEG)' 0000000033.00000)

Die AS/400 meint darauf:

[IBM][Client Access Express ODBC-Treiber (32-Bit)][DB2/400 SQL]SQL0104 - Token 000000033.00000 ungültig. Gültige Token: ),.(#-104)

Außerdem habe ich noch statt "000000033.00000" "000000033,00000" probiert. Geht aber auch nicht.

Was mache ich falsch?

Grüße,
Christian Nennewitz

JonnyRico
28-06-06, 09:10
Moin,

falsch machst du das du bevor du den eigentlichen Befehl ausführst nicht die Stored Procedure erstellst wie Baldur es beschrieben hat. Du musst dir die SP erstellen


CREATE PROCEDURE QTEMP.QCMDEXC
(IN PARM1 CHAR (512), IN PARM2 DEC(15, 5))
LANGUAGE CL NOT DETERMINISTIC NO SQL EXTERNAL
NAME QSYS.QCMDEXC PARAMETER STYLE GENERAL


und im Anschluss kannst du die SP per Call aufrufen. Du übergibst im Parameter 1 deinen richtigen Befehl und dann im Parameter 2 die Länge. Wichtig "/" statt "." im Befehl!

Gruß

Sascha

Nennewitz
28-06-06, 09:55
CREATE PROCEDURE QTEMP.QCMDEXC
(IN PARM1 CHAR (512), IN PARM2 DEC(15, 5))
LANGUAGE CL NOT DETERMINISTIC NO SQL EXTERNAL
NAME QSYS.QCMDEXC PARAMETER STYLE GENERAL


Hallo Sascha.

Ich habe das mit dem CREATE PROCEDURE ausprobiert. Das wurde anstandslos verarbeitet. Hurra! :)

Dann habe ich wieder probiert:

CALL QCMDEXC('DSPFD GES/S8 OUTFILE(GES/KANNWEG)' 0000000033.00000)

Aber leider ist die AS/400 immernoch der Meinung: "Token 000000033.00000 ungültig. Gültige Token: ),.(#-104)". :confused:

Kannst Du mir nochmal weiterhelfen?

Grüße,
Christian

JonnyRico
28-06-06, 09:57
Der Command ist auch falsch und das Komma fehlt!
CALL QCMDEXC('DSPFD FILE(GES/S8) TYPE(*MBR) OUTPUT(*OUTFILE) FILEATR(*ALL) OUTFILE(GES/KANNWEG)', LÄNGE)

Nennewitz
28-06-06, 11:00
Hallo Sascha.

:) Juhuu! :)

Es hat funktioniert. Vielen herzlichen Dank für Deine Hilfe. Dank auch an Baldur.

Damit sich auch andere daran erfreuen können habe ich die Lösung hier nochmal zusammengefaßt:

Teildateien per SQL auflisten
=============================

Aufgabenstellung: Es soll aus der Tabelle S8 in der Bibliothek GES die Teildateien ermittelt werden. Natürlich geht das auch mit anderen Bilbiotheks bzw. Tabellennamen.

1.) Stored Procedure "QCMDEXC" erstellen.
-----------------------------------------
CREATE PROCEDURE QTEMP.QCMDEXC (IN PARM1 CHAR (512), IN PARM2 DEC(15, 5)) LANGUAGE CL NOT DETERMINISTIC NO SQL EXTERNAL NAME QSYS.QCMDEXC PARAMETER STYLE GENERAL

2.) Stored Procedure "QCMDEXC" aufrufen um damit eine temporäre Tabelle zu erstellen, die die Namen der Teildateien enthält. Der Parameter "OUTFILE(GES/KANNWEG)" bedeutet, daß die temporäre Tabelle "KANNWEG" heißt und in der Bibliothek "GES" erstellt wird. Die Zahl 81 ist die Anzahl Zeichen die zwischen den beiden Hochkommas stehen. Muß man abzählen.
-----------------------------------------
CALL QTEMP.QCMDEXC('DSPFD FILE(GES/S8) TYPE(*MBR) OUTPUT(*OUTFILE) FILEATR(*ALL) OUTFILE(GES/KANNWEG)', 81)

3.) Der Inhalt der temporären Datei kann jetzt ganz normal per SELECT selektiert werden. Die Namen der Teildateien befinden sich im Feld "MBNAME".
-----------------------------------------
SELECT * FROM GES.KANNWEG

4.) Nachdem man alles gesehen hat, kann man die temporäre Tabelle wieder entfernen.
-----------------------------------------
DROP TABLE GES.KANNWEG

5.) Und die Stored Procedure, die in Punkt 1 erstellt wurde, ebenfalls.
-----------------------------------------
DROP PROCEDURE QTEMP.QCMDEXC

<< ENDE DES TEXTES >>

Sven Schneider
28-06-06, 11:21
Der Command ist auch falsch und das Komma fehlt!
CALL QCMDEXC('DSPFD FILE(GES/S8) TYPE(*MBR) OUTPUT(*OUTFILE) FILEATR(*ALL) OUTFILE(GES/KANNWEG)', LÄNGE)

Korrekt JonnyRico!
Noch ein Hinweis:
Das *PGM-Objekt QCMDEXC muss nicht mit store procedure registriert werden, sondern funktioniert auch so, wenn sie mit QSYS.QCMDEXC qualifizert angegeben wird. Das funktioniert bei der DB2/400 im Prinzip mit allen *PGM-Objekten, sofern keine Parameter/Result Sets zurückgegeben werden müssen.
Und wenn du die im Parameter OUTFILE angegebene Tabelle in der QTEMP erstellst kannst du dir auch das drop table sparen, sofern du das connect-Objekt am Ende ordentlich schliesst.

Fuerchau
28-06-06, 13:49
Na geht doch ;)

Die Prozedur ist tatsächlich nicht nötig, erleichtert aber einfach den Aufruf.
Ich kann dann den Call auch per Command mit Parametern ausführen (Beispiel ADO):
myCmd.CommandText="call qtem.qcmdexc (?, ?)"
mycmd(0)="das Kommando"
myCmd(1)=len(mycmd(0))

Ohne Prozedur (siehe ClientFehlermeldung):
"call lib.prog (parm1, parm2, ....)

Dabei werden die Parameter automatisch in eine korrekte Form übersetzt:
Zeichenketten immer in der angegebenen Länge
Zahlen immer gepackt in der angegebenen Länge !
- also um dec(15,5) zu erhalten eben 0000000000.00000

In meinem obigen Beispiel habe ich halt mal das Komma vergessen, sorry ;)