2016-07-08 8 views
0

Ich bin gerade auf der IBM i in die Welt von PASE und Qshell eingetreten und lerne immer noch den "Shell-Weg" der Problemlösung.Wie ermittelt man Datenbankbeziehungen aus PASE/Qshell?

Ich versuche, ein Shell-Skript zu schreiben, das alle logischen Dateien in einer bestimmten Bibliothek löscht, die einer bestimmten physischen Datei zugeordnet sind. Das Betriebssystem ist IBM i 7.2. In QSYS-land würde ich wahrscheinlich DSPDBR auf die physische Datei zu einem outfile, dann durch das outfile lesen und jede abhängige Datei löschen. Wie würdest du das in PASE oder Qshell tun? Ich hatte ein paar Ideen, aber alle scheinen übermäßig kompliziert zu sein, und je mehr ich über Shell-Skripting lerne, desto mehr Verknüpfungen finde ich.

Meine erste Idee war im Grunde das obige Verfahren zu wiederholen, so etwas wie dies zu tun und dann irgendwie die Ausgabe des SELECT verwenden:

system "DSPDBR FILE(MYLIB/MYFILE) OUTPUT(*OUTFILE) OUTFILE(QTEMP/DSPDBR)" 
db2 "select WHREFI from QTEMP/DSPDBR where WHRELI = 'MYLIB'" 

(ich jetzt sehen, dass QTEMP wirklich nicht als Leiharbeit Bibliothek, aber vielleicht gibt es einen Weg um das.)

Meine zweite Idee war, etwas wie pipe die Ausgabe der DSPDBR-Anweisung in etwas wie awk zu tun, um die logischen Dateinamen herauszugreifen, und die Ausgabe von diesem zu a umleiten Stream-Datei (oder Shell-Variable?). Und von dort, irgendwie benutzen Sie diese Liste, um die logischen Dateien zu löschen.

Gibt es einen einfacheren Ansatz? Es scheint so, als ob die Antwort immer gleich ist. Es wird ein Muster sein, das oft wiederholt wird, wenn Shell-Skripte geschrieben werden, um mit QSYS-Befehlen und -Objekten zu interagieren.

Antwort

1

Zuerst können Sie überprüfen Running SQL queries from PASE instead of QSH. Das Dienstprogramm db2 ist Teil von Qshell und nicht von PASE. Leider basiert die Verarbeitung, die dahinter steckt, auf ILE, weshalb sie nicht direkt in der PASE-Umgebung (AIX-Laufzeitumgebung) verwendet werden kann. Die verknüpfte Frage bietet eine Methode zur Überbrückung zwischen den beiden.

jedoch direkt in QShell, Sie mit so etwas wie dies experimentieren:

db2 "SELECT substr(VIEW_NAME,1,18), substr(OBJECT_NAME,1,10), 
     substr(OBJECT_SCHEMA,1,10), substr(VIEW_SCHEMA,1,10), 
     substr(TABLE_NAME,1,18) 
FROM qsys2.sysviewdep 
WHERE OBJECT_SCHEMA = '<yourSchemaName>'" 

Die SUBSTR() Funktionen möglicherweise oder möglicherweise nicht nützlich sein. Es hängt von Ihren Namen Längen und ob Sie sie begrenzt oder nicht wollen. Die Ausgabe kann zu einer Ausgabedatei umgeleitet werden oder vielleicht zur Bearbeitung an sed oder ein anderes Dienstprogramm weitergeleitet werden.

+0

QSYS2.SYSVIEWDEP scheint aus irgendeinem Grund meine Test-PFs und LFs nicht zu enthalten. Vielleicht werden die LFs als Indizes betrachtet und sind daher in SYSVIEWDEP nicht enthalten? – smeep

+0

Ich denke, wonach ich mehr suche, ist das allgemeine Muster, das Leute verwenden, wenn sie Shell-Skripte auf dem i schreiben, die mit QSYS-Befehlen/Programmen interagieren müssen.In meinem obigen LF-Szenario frage ich mich, was der richtige Weg ist, um eine Liste von LFs für einen gegebenen PF zu erhalten. Sollte das Skript ein Programm aufrufen schreibe ich in QSYS um die Liste zu bekommen? Sollte es die piped Ausgabe des DSPDBR Befehls parsen? Sollte es mit einer von DSPDBR generierten Ausgabedatei funktionieren? Wenn Sie versuchen, QSYS-Objekte zu manipulieren und Metadaten aus einer Shell zu erhalten, welche Muster verwenden die Leute? – smeep

+0

@smeep Können Sie Ihre Frage bearbeiten, um diese letzten Details zu klären? (Kommentare können vorübergehend sein.) Sind Sie mehr an PASE interessiert? QShell ist relativ gut in das Betriebssystem integriert, während PASE eine spezifischere Programmierung für die Replikation oder den Zugriff auf IBM i-Features innerhalb einer AIX-Laufzeit erfordert. – user2338816

1

Eine QTEMP-Bibliothek ist spezifisch für den Prozess, der die Anforderung in der Shell implementiert. Stellen Sie sicher, dass alle Anforderungen, die von derselben QTEMP-Bibliothek abhängen, im selben Prozess ausgeführt werden. Das System Dienstprogramm wird in einem separaten Prozess ausgeführt, wie auch das Dienstprogramm db2. Im folgenden Befehlszeilenaufruf von QSHell werden beispielsweise alle von QTEMP abhängigen Anforderungen im selben Prozess ausgeführt, in dem auch das db2-Dienstprogramm ausgeführt wird. das db2 Dienstprogramm führt ein Skript [oder könnte stattdessen eine dynamische Verbindung Anweisung ausführen], dass in diesem Szenario erzeugt wurde durch die scripted Anfragen nach \ innerhalb des Shell-Dienstprogramm:

qsh cmd('                 
    echo "call qsys2.qcmdexc             
      (''dspdbr mylib/myfile output(*outfile) outfile(qtemp/dspdbr)'') 
     " >> mydb2.script             
; echo "select WHREFI from QTEMP.DSPDBR where WHRELI =''MYLIB''   
     " >> mydb2.script             
; db2 -f mydb2.script             
; rm  mydb2.script             
     ')                 
+0

Ist hier der Schlüssel, dass qsys2.qcmdexc - im Gegensatz zu 'system' - innerhalb des übergeordneten Prozesses (in diesem Fall' db2') läuft, und so sieht die select-Anweisung die gleiche QTEMP-Bibliothek wie DSPDBR? – smeep

+0

Korrekt; Die gespeicherte Prozedur CALL wird synchron innerhalb desselben Prozesses wie die vorherigen und späteren geskripteten Anfragen ausgeführt. Alle skriptgesteuerten Anforderungen, die innerhalb eines 'db2'-Aufrufs ausgeführt werden, werden in dem separaten Prozess ausgeführt, der für diesen 'db2'-Aufruf gestartet wurde. Für diese Prozesse wird diese QTEMP-Bibliothek beibehalten, bis der Prozess beendet wird Anforderungen, die in diesem Prozess ausgeführt werden. – CRPence

Verwandte Themen