Wie kann ich programmatisch eine komplexe Abfrage ausführen, die auf einer as400?
Ich bin neu bei arbeiten auf einer as400 und ich habe eine Abfrage, die joins über 4 Tabellen. Die Abfrage selbst ist in Ordnung, es läuft in STRSQL und zeigt die Ergebnisse an.
Was ich bin, zu kämpfen, ist immer die Abfrage ausführen zu können programmgesteuert (es wird schließlich ausgeführt werden, von einer geplanten CL-Skript).
Ich versucht haben, erstellen Sie eine physische Datei, die die Abfrage enthält, läuft es mit RUNQRY, aber es zeigt einfach die Abfrage selbst, nicht das tatsächliche Ergebnis eingestellt.
Weiß jemand, was ich falsch mache?
UPDATE
Danke an alle für die Richtung und die Ressourcen, mit Ihnen war ich in der Lage, mein Ziel zu erreichen. Falls es hilft jemand, das ist, was ich am Ende tun (dies alles geschah in der eigenen Bibliothek ZUORDNEN):
-
Erstellt eine physische Quell-Datei (mit CRTSRCPF): QSQLSRC, und erstellt ein Element mit dem Namen SQLLEAGSEA, mit der Art von TXT -, enthält die SQL-Anweisung.
-
Erstellt eine andere physische Quell-Datei: QCLSRC, und erstellt ein Element mit dem Namen POPLEAGSEA, mit der Art der CLP-Verordnung, dass änderungen der aktuellen Bibliothek zu RESERVIEREN, dann läuft die Abfrage mit RUNSQLSTM (mehr Details dazu weiter unten). Hier ist der eigentliche Befehl:
RUNSQLSTM SRCFILE(QSQLSRC) SRCMBR(SQLLEAGSEA) COMMIT(*NONE) BENENNUNG(*SYS)
-
Hinzugefügt CLP-geplante Aufträge (mit ADDJOBSCDE), den folgenden Befehl ausführen:
CALL PGM(ZUORDNEN/POPLEAGSEA)
Hinsichtlich RUNSQLSTM, meine Forschung zeigte, dass ich war nicht in der Lage sein, um diese Funktion zu verwenden, weil es nicht die Unterstützung von SELECT-Anweisungen. Was ich nicht deuten, meine Frage war, was ich brauchte, um zu tun, mit dem Ergebnis - ich werde einfügen und die daraus resultierenden Daten in eine andere Tabelle (hatte ich getan, dass ich bin sicher, die helfen könnten, haben herausgefunden, dass aus viel schneller). So effektiv, ich wollte nicht zu tun, WÄHLEN Sie eine, mein Ergebnis ist tatsächlich ein INSERT. Also meine SQL-Anweisung (in SQLLEAGSEA) beginnt mit:
INSERT INTO
ZUORDNEN/LEAGSEAS
WÄHLEN
...
BLA BLA BLA
...
Aus meinen Recherchen entnehme ich, dass RUNSQLSTM nicht unterstützt, WÄHLEN Sie, weil es nicht mit einem Mechanismus zu tun, nichts mit den Ergebnissen. Sobald ich nicht mehr die Einnahme von baby-Schritte und erkannte, dass ich brauchte, um die SELECT-UND INSERT in die gleiche Anweisung, es löste mein Hauptproblem.
Nochmals vielen Dank an alle!
- Ich würde hier beginnen, wenn Sie nicht schon dort gewesen. mcpressonline.com/sql/... viel Glück! Ich bin auch nur unwesentlich funktionale im AS400/iseries-ökosystem.
- Ein Tipp für diejenigen, die neu auf der Plattform. Sie wahrscheinlich nicht verwenden Sie eine AS/400. IBM hat nicht verkauft eine AS/400 seit dem Jahr 2000. iSeries-und System i waren die Nachfolger-Systeme, aber die aktuelle hardware benannt ist einem IBM Power Systems mit POWER7+ - chips. IBM ' s Watson gespielt, Jeopardy! auf Power7-System-hardware. Das aktuelle Betriebssystem namens IBM i 7.1. Power Systems können auch mehrere Kopien von AIX -, Linux-und/oder IBM i, in der virtuelle Maschinen, sogenannte logical partions ("LPAR"s).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den Befehl
RUNSQLSTM
zum ausführen einer statischen SQL-Anweisung, die in einer physischen Datei-Mitglied oder stream-Datei.Es ist ein nicht-interaktives-Befehl ein, so wird es nicht ausführen sql-Anweisungen, die versuchen, einen Ergebnissatz zurückzugeben.
Wenn du mehr Kontrolle haben möchten, einschließlich der Fähigkeit zu laufen, zu interactive statements finden Sie in der Qshell db2-Dienstprogramm.
Beispiel:
Beachten Sie, dass die
db2
Dienstprogramm akzeptiert nur die *SQL-naming convention.QM-Abfrage
Wenn alle SQL Sie brauchen, ist die einzigen komplexen SQL-Anweisung, und das ist, was es klingt wie, dann Ihre beste Wette ist die Verwendung von Query-Management-Abfrage (siehe QM-Query Handbuch hier).
Die Ergebnisse gerichtet werden kann, eine Anzeige, eine spool-Datei, oder eine physische Datei (dh eine DB2-Tabelle). Standardmäßig wird die Ausgabe bei der Ausführung interaktiv ist auf dem Bildschirm, aber wenn Sie ausführen, in eine (geplante) batch-job wird standardmäßig ein spool-Datei-Bericht.
Können Sie erstellen der QM-Abfrage interaktiv über
WRKQMQRY
, in der Sie dazu aufgefordert werden-Modus (ähnlich wie Query/400) oder im SQL-Modus. Oder kompilieren Sie den QM-Query, aus der Quelle, mit derCRTQMQRY
Befehl.Zu führen Ihr QM-Abfrage
STRQMQRY
Befehl.RUNSQL cmd
Wenn Sie mit einem system mit IBM i 7.1 voll up-to-date, und hat die Technologie-Refresh 4 (TR4) installiert, dann könnte man auch das neue
RUNSQL
Befehl zur Ausführung einer einzigen Anweisung. (siehe Diskussion im developerWorks)SQL-Scripting w/RUNSQLSTM cmd
Aus der CL können Sie SQL-Skripts zu starten, der mehrere SQL-Anweisungen aus einer Quelldatei Mitglied. Es gibt keine standard-Quell-Datei-Namen für diese, aber QSQLSRC wird Häufig verwendet. Die Quelle Element können mit mehreren nicht-interaktiven SQL-Anweisungen. Dies bedeutet, Sie können verwenden Sie eine SELECT-Anweisung (direkt), da es theoretisch nicht wissen, wo zu senden die Ergebnisse an. CL-Befehlen sind sogar erlaubt, wenn gegeben, eine
CL:
Präfix. Sowohl SQL und CL-Anweisungen mit einem Semikolon beendet;
. Während die SQL-Anweisungen können nicht die Anzeige von Daten direkt auf dem Bildschirm, die gleiche Einschränkung gilt nicht für die Skript-CL-Befehlen.Den
STRQMQRY
Befehl eingebettet werden kann in dieRUNSQLSTM
Skript, indem Sie das Präfix "CL:" vor dem Befehl. Da STRQMQRY können direkt auf dem Bildschirm ausgegeben werden, einen Bericht oder eine Ausgabe-Tabelle, kann dies sehr nützlich.Denken Sie daran, dass direkt Ihre Ausgabe aus einer SELECT-Abfrage in eine Datei können Sie entweder ein INSERT oder CREATE TABLE-Anweisungen.
Oder, um die Ergebnisse in eine Tabelle, die Sie erstellen in Ihrem Auftrag die Bibliothek QTEMP:
[Hinweis: Wenn Sie die Quelle verwendet werden
CRTQMQRY
sind Sie beraten, um es zu schaffen alsCRTSRCPF yourlib/QQMQRYSRC RCDLEN(91)
ist, da der compiler verwendet nur 79 Spalten Ihrer Datenquelle (hinzufügen 12 für die Reihe und ändern Sie Datum =91). Aber für die QM-Formulare, die verwendet werden können, um zusätzliche Formatierungen, dieCRTQMFORM
compiler verwenden 81 Spalten, soRCDLEN(93)
wird empfohlen, für die QQMFORMSRC.]RUNQRY ist ein Dienstprogramm, mit dem Sie eine Abfrage ausführen, die erstellt wurde, indem Sie ein anderes Dienstprogramm namens WRKQRY. Wenn Sie wirklich wollen, um die Verarbeitung von SQL-Anweisungen in einer Datei versuchen Sie RUNSQLSTM. Es verwendet eine physische Quell-Datei zu speichern, die Aussagen, nicht um eine Datenbank-Datei. Der standard-name für die betreffende Quelle die physische Datei ist QQMQRYSRC. Zum erstellen dieser Datei, CRTSRCPF yourlib/QQMQRYSRC. Dann können Sie mit PDM zu arbeiten mit, dass source-PF. WRKMBRPDM yourlib/QQMQRYSRC. Verwenden Sie F6 zum erstellen einer neuen Quellcode-Mitglied. Machen Quelle Typ TXT. Dann verwenden Sie option 2, um zu starten wird ein editor aufgerufen, SEU. Kopieren/einfügen von SQL-statements in diesem editor. F3-Taste, um speichern Sie die Quelle. Wenn die Quelle gespeichert wird, verwenden Sie RUNSQLSTM, um es auszuführen.
Ist es (jetzt) nicht möglich ist, führen Sie SQL direkt in ein CL-Programm, ohne Verwendung von QM-Query, RUNSQLSTM oder QShell.
Hier ist ein Artikel, der beschreibt die RUNSQL-Anweisung in CL-Programmen...
http://www.mcpressonline.com/cl/the-cl-corner-introducing-the-new-run-sql-command.html
Artikel enthält Informationen darüber, was OS Ebenen werden unterstützt sowie klare Beispiele für verschiedene Möglichkeiten nutzen, um die RUNSQL-Anweisung.
Dies funktioniert in zwei Schritten:
Den ersten Schritt erstellt eine temporäre Tabelle, Ergebnis in qtemp und der zweite Schritt/Zeile läuft ein ad-hoc-Abfrage, die in der temporären Tabelle in eine spool-Datei.
Dank,
Michael Frilot
Es ist natürlich eine ganz andere Lösung: Sie schreiben könnten, und kompilieren Sie ein Programm mit der Anweisung. Es erfordert etwas mehr Lesen in, vor allem, wenn Sie neu in der Plattform, aber es sollte Ihnen die meiste Flexibilität, was Sie tun, mit den Ergebnissen. Sie können die Verwendung von SQL in C, C++, RPG, RPG/LE, REXX, PL (von denen ich nicht weiß, was es ist) und COBOL. Dies zu tun, können Sie reagieren in jeder verarbeitbaren Art und Weise auf die Ergebnisse aus einer Abfrage und starten/erstellen von Abfragen basierend auf dem, was Sie bekommen.
Obwohl einige altmodischen RPG-Programmierer versuchen alles zu leugnen SQL in RPG existiert, ist es heute möglich, für viele Anwendungsfälle, schreiben, RPG-Programme mit SQL nur und keine direkten Datei Zugriff (ohne F-Specs, für diejenigen, die wissen RPG).
Wenn deine Lösung funktioniert für Sie, perfekt. Wenn Sie brauchen, um etwas anderes zu tun, versuchen, einen Blick in diese pdf: http://publib.boulder.ibm.com/infocenter/iseries/v5r3/topic/rzajp/rzajp.pdf
Die integration in RPG ist auch nicht schlecht. Es funktioniert mit den normalen Programmablauf. Würde in etwa so Aussehen (in freier form):
In diesem
var1
,var2
, undsearchval
sind die gewöhnlichen RPG-Variablen. Keine Quotierung erforderlich. Funktioniert auch mit Datenstrukturen (extern definiert z.B., die record-format der Datei selbst gut passt). Sie können arbeiten mit Cursor und Schleifen natürlich auch. Ich fühle, dass RPG-Programme neigen dazu, leichter zu Lesen mit dieser.