Wie programmiere ich programmatisch eine komplexe Abfrage auf einem as400?

8

Ich bin neu bei der Arbeit an einem as400 und ich habe eine Abfrage der Joins über 4 Tabellen. Die Abfrage selbst ist in Ordnung, sie läuft in STRSQL und zeigt die Ergebnisse an.

Was mich beschäftigt, ist, dass die Abfrage programmgesteuert ausgeführt werden kann (sie wird schließlich von einem geplanten CL-Skript ausgeführt).

Ich habe versucht, eine physische Datei zu erstellen, die die Abfrage enthält, die sie mit RUNQRY ausführt, aber es zeigt einfach die Abfrage selbst an, nicht die tatsächliche Ergebnismenge.

Weiß jemand, was ich falsch mache?

AKTUALISIEREN

Danke allen für die Richtung und die Ressourcen, mit denen ich mein Ziel erreichen konnte. Für den Fall, dass es irgendjemandem hilft, ist es das, was ich getan habe (all das wurde in seiner eigenen Bibliothek gemacht, ALLOCATE):

  1. Eine physische Quelldatei (mit CRTSRCPF) erstellt: QSQLSRC und ein Member namens SQLLEAGSEA mit dem Typ TXT erstellt, der die SQL-Anweisung enthält.

  2. Erstellte eine andere physische Quelldatei: QCLSRC und erstellte ein Member namens POPLEAGSEA mit dem CLP-Typ, der die aktuelle Bibliothek in ALLOCATE ändert und dann die Abfrage mit RUNSQLSTM ausführt (mehr dazu unten). Hier ist der eigentliche Befehl:

    RUNSQLSTM SRCFILE (QSQLSRC) SRCMBR (SQLLEAGSEA) COMMIT (* KEINE) NAMING (* SYS)

  3. Fügen Sie den geplanten Jobs den CLP hinzu (mit ADDJOBSCDE) und führen Sie den folgenden Befehl aus:

CALL PGM (ALLOCATE / POPLEAGSEA)

Im Hinblick auf RUNSQLSTM haben meine Recherchen ergeben, dass ich diese Funktion nicht verwenden kann, da sie SELECT-Anweisungen nicht unterstützt. Was ich in meiner Frage nicht angegeben hatte, war, was ich mit dem Ergebnis anfangen sollte - ich würde die resultierenden Daten in einen anderen Tisch einfügen (hatte ich getan, dass die Hilfe das viel herausgefunden haben könnte) schneller). So effektiv, ich würde nicht ein SELECT, mein Endergebnis ist eigentlich ein INSERT. Also meine SQL-Anweisung (in SQLLEAGSEA) beginnt mit:

EINFÜGEN IN   ZUWEISEN / LEAGSEAS

AUSWÄHLEN   ...   BLAH BLAH BLAH   ...

Aus meinen Nachforschungen entnehme ich, dass RUNSQLSTM SELECT nicht unterstützt, weil es keinen Mechanismus hat, etwas mit den Ergebnissen zu tun. Sobald ich aufhörte, Baby-Schritte zu machen und erkannte, dass ich AUSWÄHLEN UND EINFÜGEN in der gleichen Aussage tun musste, löste es mein Hauptproblem.

Nochmals vielen Dank!

    
Jared 16.10.2012, 19:54
quelle

6 Antworten

4

Der Befehl lautet RUNSQLSTM , um ein statisches SQL auszuführen Anweisung in einem physischen Dateielement oder einer Stream-Datei.

Es ist ein nicht interaktiver Befehl, so dass SQL-Anweisungen, die versuchen, eine Ergebnismenge zurückzugeben, nicht ausgeführt werden.

Wenn Sie mehr Kontrolle wünschen, einschließlich der Möglichkeit, interaktive Anweisungen auszuführen, finden Sie in der Qshell db2-Dienstprogramm .

Zum Beispiel:

%Vor%

Beachten Sie, dass das Dienstprogramm db2 nur die * SQL-Namenskonvention akzeptiert.

    
jamesallman 16.10.2012 20:30
quelle
4

QM-Abfrage

Wenn Sie nur die einzige komplexe SQL-Anweisung benötigen, die SQL benötigt, dann sollten Sie am besten Query Management Query (siehe QM Query Handbuch hier) .

Die Ergebnisse können an eine Anzeige, eine Spool-Datei oder eine physische Datei (dh eine DB2-Tabelle) gerichtet werden. Die Standardausgabe wird bei interaktiver Ausführung auf dem Bildschirm angezeigt. Wenn sie jedoch in einem (geplanten) Stapeljob ausgeführt wird, wird standardmäßig ein Spool-Dateibericht verwendet.

Sie können die QM-Abfrage interaktiv über WRKQMQRY im eingeblendeten Modus (ähnlich wie Query / 400) oder im SQL-Modus erstellen. Oder Sie können die QM-Abfrage aus der Quelle mit dem Befehl CRTQMQRY kompilieren.
Um Ihre QM-Abfrage auszuführen, verwenden Sie den Befehl STRQMQRY .

RUNSQL cmd

Wenn Sie ein System verwenden, auf dem IBM i 7.1 vollständig auf dem neuesten Stand ist und Technology Refresh 4 (TR4) installiert ist, können Sie auch den neuen Befehl RUNSQL verwenden, um eine einzelne Anweisung auszuführen. (siehe Diskussion in developerWorks)

SQL Scripting mit RUNSQLSTM cmd

Von CL aus können Sie SQL-Skripte mehrerer SQL-Anweisungen von einem Quelldateielement ausführen. Hierfür gibt es keinen Standard-Standarddateinamen, aber QSQLSRC wird häufig verwendet. Das Quellenelement kann mehrere nicht interaktive SQL-Anweisungen enthalten. Das bedeutet, dass Sie eine SELECT-Anweisung (direkt) nicht verwenden können, da sie theoretisch nicht weiß, wohin sie die Ergebnisse senden soll. CL-Befehle sind sogar erlaubt, wenn ein CL: Präfix gegeben wird. Sowohl SQL- als auch CL-Anweisungen sollten mit einem Semikolon ; beendet werden. Während die SQL-Anweisungen Daten nicht direkt auf dem Bildschirm anzeigen können, gilt diese Einschränkung nicht für die CL-Skriptbefehle.

Der Befehl STRQMQRY kann in das Skript RUNSQLSTM eingebettet werden, indem das Präfix "CL:" vor den Befehl gesetzt wird. Da STRQMQRY die Ausgabe an den Bildschirm, einen Bericht oder eine Ausgabetabelle richten kann, kann dies sehr nützlich sein.

Denken Sie daran, dass Sie, um Ihre Ausgabe von einer SELECT-Abfrage an eine Datei zu leiten, entweder die Anweisungen INSERT oder CREATE TABLE verwenden können.

%Vor%

Oder fügen Sie die Ergebnisse in eine Tabelle ein, die Sie in der QTEMP-Bibliothek Ihres Jobs erstellen:

%Vor%

[Hinweis: Wenn Sie die von CRTQMQRY zu verwendende Quelle erstellen, sollten Sie sie als CRTSRCPF yourlib/QQMQRYSRC RCDLEN(91) erstellen, da der Compiler nur 79 Spalten Ihrer Quelldaten verwendet (12 für Sequenz und Änderungsdatum hinzufügen) = 91). Bei QM-Formularen, die für zusätzliche Formatierungen verwendet werden können, verwendet der CRTQMFORM -Compiler jedoch 81 Spalten, so dass RCDLEN(93) für QQMFORMSRC empfohlen wird.]

    
WarrenT 17.10.2012 22:47
quelle
2

RUNQRY ist ein Dienstprogramm, mit dem Sie eine Abfrage ausführen können, die von einem anderen Dienstprogramm namens WRKQRY erstellt wurde. Wenn Sie SQL-Anweisungen in einer Datei wirklich verarbeiten möchten, versuchen Sie RUNSQLSTM. Es verwendet eine physische Quelldatei zum Speichern der Anweisungen, keine Datenbankdatei. Der Standardname für diese physische Quelldatei ist QQMQRYSRC. Um diese Datei zu erstellen, CRTSRCPF yourlib / QQMQRYSRC. Dann können Sie PDM verwenden, um mit diesem Quell-PF zu arbeiten. WRKMBRPDM yourlib / QQMQRYSRC. Verwenden Sie F6, um ein neues Quellenelement zu erstellen. Machen Sie es Quellentyp TXT. Verwenden Sie dann Option 2, um einen Editor namens SEU zu starten. Kopieren / fügen Sie Ihre SQL-Anweisungen in diesen Editor ein. F3 um die Quelle zu speichern. Sobald die Quelle gespeichert ist, verwenden Sie RUNSQLSTM, um sie auszuführen.

    
Buck Calabro 16.10.2012 20:32
quelle
2

Es ist (jetzt) ​​möglich, SQL direkt in einem CL-Programm auszuführen, ohne QM Query, RUNSQLSTM oder QShell zu verwenden.

Hier ist ein Artikel, der die RUNSQL-Anweisung in CL-Programmen behandelt ...

Ссылка

Der Artikel enthält Informationen darüber, welche Betriebssystemebenen unterstützt werden, sowie klare Beispiele für verschiedene Möglichkeiten zur Verwendung der RUNSQL-Anweisung.

    
Bill M 18.01.2013 21:43
quelle
1

Dies funktioniert in zwei Schritten:

%Vor%

Der erste Schritt erstellt ein temporäres Tabellenergebnis in qtemp und der zweite Schritt / Zeile führt eine Adhoc-Abfrage über nur die temporäre Tabelle in eine Spool-Datei.

Danke, Michael Frilot

    
user2466974 08.06.2013 19:20
quelle
1

Es gibt natürlich eine völlig andere Lösung: Sie könnten ein Programm schreiben und kompilieren, das die Anweisung enthält. Es erfordert etwas längeres Einlesen, vor allem, wenn Sie neu auf der Plattform sind, aber es sollte Ihnen die größtmögliche Flexibilität hinsichtlich Ihrer Ergebnisse geben. Sie können SQL in C, C ++, RPG, RPG / LE, REXX, PL (von denen ich nicht weiß, was es ist) und COBOL verwenden. Auf diese Weise können Sie auf eine beliebige Weise auf die Ergebnisse einer Abfrage reagieren und andere Abfragen starten / erstellen, je nachdem, was Sie erhalten.

Obwohl einige altmodische RPG-Programmierer alles versuchen, um SQL in RPG zu verweigern, ist es heute in vielen Fällen möglich, RPG-Programme nur mit SQL und ohne direkten Dateizugriff zu schreiben (ohne F-Specs, für diejenigen, die RPG kennen ).

Wenn Ihre Lösung für Sie arbeitet, perfekt. Wenn Sie etwas anderes tun müssen, werfen Sie einen Blick in dieses PDF: Ссылка

Die Integration in RPG ist nicht allzu schlecht. Es funktioniert mit dem normalen Programmablauf. Würde in etwa so aussehen (in freier Form):

%Vor%

Dabei sind var1 , var2 und searchval normale RPG-Variablen. Kein Zitat erforderlich. Funktioniert auch mit Datenstrukturen (extern definiert z. B. passt das Datensatzformat der Datei selbst gut). Sie können natürlich auch mit Cursoren und Loops arbeiten. Ich denke, dass RPG-Programme dazu neigen, leichter zu lesen.

    
kratenko 24.10.2012 12:33
quelle

Tags und Links