Nachdem wir uns im letzten Artikel mit dem IBM SQL Service SEND_EMAIL beschäftigt haben, wenden wir uns jetzt den Funktionen LPRINTF und COMPARE_IFS zu.
Die SYSTOOL Entwicklerfunktionen
Folgende SQL Services sollen hier bzw. in den folgenden Artikeln angesprochen werden:
- GENERATE_SPREADSHEET: Daten der DB2 in ein Tabellenformat (ASCII) konvertieren
- GENERATE_PDF: Der Name spricht für sich; PDF Dokumente aus IBM i Spools erstellen
- SEND_EMAIL: Auch hier spricht der Name; Emails versenden
- LPRINTF: Nachrichten ins IBM i Joblog ausgeben
- COMPARE_IFS: IFS-Verzeichnisse miteinander vergleichen. Diese Funktion ist nicht Bestanteil der Bibliothek SYSTOOLS, sondern in QSYS2
Eine Dokumentation dieser Services finden Sie hier:
https://www.ibm.com/docs/en/i/7.5.0?topic=services-ifs
https://www.ibm.com/docs/en/i/7.6.0?topic=services-ifs
LPRINTF
Die Prozedur LPRINTF schreibt eine Informationsmeldung in das Jobprotokoll. Sie hat die Gewichtung 0 und enthält keine Nachrichten-ID.
Die Parametrisierung der Funktion LPRINTF gestaltet sich sehr einfach:
Quelle: IBMQuelle: https://www.ibm.com/docs/en/i/7.4.0?topic=services-lprintf-procedure
Parameter:
PRINT_STRING: Eine Zeichen- oder Grafikzeichenfolge mit den in das Jobprotokoll zu schreibenden Informationen. Die Länge kann bis zu 30.720 Zeichen betragen.
LPRINTF aufrufen

Quelle: LuttkusDie Frage, die jetzt im Raum steht, ist: Was soll ich damit anfangen. Es geht bei dieser Funktion darum, eigene Informationsnachrichten aus einem SQL-Script oder aus einer mit SQL programmierten Funktion bzw. Stored Procedure an das Joblog zu senden.
Hier ein kurzes Snippet aus einer SQL UDFl:
Quelle: LuttkusCOMPARE_IFS
Wir kennen es fast alle aus unserer Entwicklungsarbeit: Wir haben ein IFS-Verzeichnis gefüllt mit Dateien. Um einen Zwischenstand der Entwicklungsarbeit zu “retten” kopieren wir dieses Verzeichnis. Irgendwann, vielleicht möchten wir den geretteten Zwischenstand wieder zurückbringen, sehen wir uns die beiden Verzeichnisse an und fragen uns, inwiefern sich der Inhalt dieser beiden Verzeichnisse unterscheidet.
Jetzt kommt die Funktion COMPARE_IFS ins Spiel.
Die Tabellenfunktion COMPARE_IFS gibt Unterschiede zwischen den angegebenen Objekten des integrierten Dateisystems (IFS) zurück. Dies kann ein einzelnes Objekt oder eine Teilstruktur von Objekten sein, die in einem angegebenen Verzeichnis beginnen.
Es kann entweder ein Namensvergleich oder ein vollständiger Attributvergleich angefordert werden. Beim Attributvergleich wird für jedes Attribut, das sich zwischen einem Objektpaar unterscheidet, eine Zeile zurückgegeben. Die Attribute sind eine Teilmenge der von den Tabellenfunktionen QSYS2.IFS_OBJECT_STATISTICS und QSYS2.IFS_OBJECT_PRIVILEGES zurückgegebenen Werte.
Wenn für kein Objekt Unterschiede gefunden werden, werden keine Zeilen zurückgegeben. Das integrierte Dateisystem unterstützt zahlreiche Dateisysteme. Es können nur Objekte in den Root-Dateisystemen (/) und QOpenSys verglichen werden. Andere Dateisysteme werden nicht unterstützt.
Die angegebenen Startpfadnamen1 und Startpfadnamen2 müssen sich in einem unterstützten Dateisystem befinden, andernfalls tritt ein Fehler auf.
Die Parametrisierung von COMPARE_IFS sieht wie folgt aus:
Quelle: IBMQuelle: https://www.ibm.com/docs/en/i/7.4.0?topic=services-compare-ifs-table-function
Parameter:
- START_PATH_NAME1: Bezeichnet Startpfadname1 ein Objekt, wird dieses mit dem von Startpfadname2 bereitgestellten Objekt verglichen. Bezeichnet Startpfadname1 ein Verzeichnis, werden das Verzeichnis und alle in der Objekttypliste enthaltenen Objekte mit dem von Startpfadname2 bereitgestellten Verzeichnis verglichen. Beim Vergleich von Verzeichnissen bestimmt der Parameter „subtree-directories“, ob Unterverzeichnisse verarbeitet werden.
- START_PATH_NAME1: Ein Ausdruck, der den Pfadnamen für das zweite Objekt des Vergleichs zurückgibt. Ein relativer Pfadname bezieht sich auf das aktuelle Verzeichnis. Ist kein absoluter Pfadname angegeben, wird das aktuelle Arbeitsverzeichnis auf rdb2 in Kombination mit dem relativen Pfadnamen verwendet, um das Objekt aufzulösen. Das Objekt muss auf dem Server vorhanden sein, der implizit oder explizit durch rdb2 identifiziert wird.
- RDB2
- Ein Zeichen- oder Grafikstring-Ausdruck, der die relationale Datenbank identifiziert, in der Startpfadname2 vorhanden ist.
- RDB2
- SUBTREE_DIRECTORIES: Ein Ausdruck, der angibt, ob alle Unterverzeichnisse rekursiv verglichen werden. Dieser Parameter gilt nur beim Vergleich von Verzeichnissen. Andernfalls wird der Wert ignoriert.
- NO
- Die Objekte im durch Startpfadname1 identifizierten Verzeichnis werden mit den Objekten im durch Startpfadname2 identifizierten Verzeichnis verglichen.
- YES
- Alle Objekte in allen Unterverzeichnissen des durch Startpfadname1 identifizierten Verzeichnisses werden mit den entsprechenden Objekten in Startpfadname2 verglichen. Dies ist die
- OBJECT_TYPE_LIST: Eine Liste mit einem oder mehreren Objekttypen, die in den Vergleich einbezogen werden sollen. Ein oder mehrere Leerzeichen trennen mehrere Werte. Die Standardeinstellung ist *ALL und bedeutet, dass alle Objekttypen verglichen werden. Unterstützte Werte sind alle Root- (/) und QOpenSys-Dateisystemobjekttypen (*CHRSF, *DIR, *FIFO, *SOCKET, *STMF, *SYMLNK) sowie die folgenden Sonderwerte:
- *ALL
- Vergleicht alle Root- (/) und QOpenSys-Dateisystemobjekttypen. Dies sind *CHRSF, *DIR, *FIFO, *SOCKET, *STMF und *SYMLNK.
- *ALLSAV
- Vergleicht alle Root- (/) und QOpenSys-Dateisystemobjekttypen, die mit dem Befehl „Speichern“ (SAV) gespeichert werden können. Dies sind *CHRSF, *DIR, *FIFO, *STMF und *SYMLNK.
- COMPARE_ATTRIBUTES: Ein String-Ausdruck, der angibt, welche Attribute für ein Objekt verglichen werden.
- NAMES
- Es werden nur die Objektnamen verglichen. Für Namen, die nicht in beiden Verzeichnissen gefunden werden, wird eine Zeile zurückgegeben. Diese Option ist nur beim Vergleich von Verzeichnissen zulässig.
- YES
- Die Attribute werden für ein Objekt verglichen. Für jeden gefundenen Unterschied wird eine Zeile zurückgegeben.
- Wenn dieser Parameter weggelassen wird und Startpfadname1 und Startpfadname2 Verzeichnisse sind, wird standardmäßig NAMES verwendet. Andernfalls wird YES verwendet.
- Die für ein Objekt verglichenen Attribute variieren je nach Objekttyp. Nicht alle Attribute können verglichen werden.
Beispiel 1
Ich beabsichtige, die Attribute zweier Verzeichnisse zu vergleichen.
Quelle: Luttkus
Quelle: LuttkusWir sehen:
- (PATH_NAME2), dass einige Objekte in diesem Pfad nicht existieren.
- (PATH_NAME1) , dass in diesem Pfad ebenfalls ein Objekt nicht existiert.
- (ATTRIBUTE_NAME), dass es viele Unterschiede zwischen den Objekten gibt. Die meisten beziehen sich auf Rechtevergaben
Beispiel 2
Ich realisiere einen Namensvergleich.
Quelle: Luttkus
Quelle: LuttkusWir sehen, dass folgendes Objekt (PATH_NAME2) /Development/Projekte/iProject_SAV/QRPGLESRC/MSG.RPGLE in PATHNAME_1 nicht existiert.
Achtung! Sie sollten wissen, dass je mehr Objekte miteinander verglichen werde, die Laufzeit dieses Befehles sich dramatisch erhöhen kann.
Im nächsten Artikel wenden wir uns der noch einmal der Bibliothek SYSTOOLS zu, um dain befindliche Tools zu modifizieren und entsprechend unseren Bedürfnissen anzupassen.
Lesen Sie dazu SQL Application Services – Teil 15.05: Ein besseres SEND_EMAIL erstellen.
Klaus-Peter Luttkus schreibt regelmäßig für den MIDRANGE Deep Dive.
Sie erreichen ihn unter:
