Qshell db2 Utility auf IBM i – SQL-Skripte sauber ausführen, automatisieren und prüfen

Kompakt, skriptbar und erstaunlich nützlich: So nutzt Du das Qshelldb2Utility für Db2 for i richtig – inklusive Stolperfallen, Beispiel-SQL und sauberem Workflow.
db2Utility ist eines dieser IBM-i-Werkzeuge, die schnell unterschätzt werden. Es sieht unscheinbar aus, kann aber SQL-Statements direkt ausführen, Skripte aus dem IFS verarbeiten und einfache Automatisierungen massiv erleichtern. Genau deshalb lohnt sich ein frischer Blick: nicht als nostalgischer AS/400-Trick, sondern als pragmatisches Werkzeug für moderne IBM-i-Entwicklung, DevOps-nahe Abläufe, Datenbanktests und kleine Wartungsjobs.1. Was ist das Qshell db2 Utility?
Qshell ist eine Unix-ähnliche Shell- und Skriptumgebung auf IBM i. Das darin verfügbaredb2Utility ist ein Kommandozeilenwerkzeug für Db2 for i. Es nutzt die SQL CLI und kann SQL-Statements direkt, interaktiv oder aus einer Datei ausführen.
db2Utility ist ein leichter SQL-Ausführer für IBM i. Du kannst damit schnell testen, SQL-Skripte aus dem IFS starten, kleine Setups automatisieren oder Datenbankaktionen in technische Abläufe einbauen.Das ist besonders praktisch, wenn Du SQL-Skripte ohnehin im IFS liegen hast – zum Beispiel unter/home/deinuser/sql, in einem Git-Checkout, in einem Deployment-Verzeichnis oder in einer technischen Testumgebung.
2. Wann ist das Utility sinnvoll?
Das Tool ist kein Ersatz für IBM i Access Client Solutions, Navigator for i oder saubere Deployment-Prozesse. Aber es ist verdammt nützlich, wenn Du einfache SQL-Aktionen wiederholbar ausführen möchtest.
| Einsatzfall | Warum Qshell db2 passt | Worauf Du achten solltest |
|---|---|---|
| Beispieldaten aufbauen | Skripte fürCREATE TABLEundINSERTlassen sich schnell ausführen. |
Bibliothek sauber setzen, Constraints und Drop-Reihenfolge beachten. |
| Technische Tests | SQL kann reproduzierbar aus Dateien laufen. | Output und Exit-Code prüfen, nicht nur „läuft irgendwie“. |
| Ad-hoc-Analyse | Einzelne SELECTs sind schnell auf der Kommandozeile getestet. | Shell-Zeichen und Quotes sauber behandeln. |
| Automatisierung | Qshell-Kommandos lassen sich aus CL oder Jobs aufrufen. | Logging, Berechtigungen und Fehlerbehandlung einplanen. |
| Lokale IBM-i-Datenbank | Ohne weitere Verbindungseinstellungen nutzt das Utility die lokale Datenbank. | Remote-Zugriff braucht einen passenden relationalen Datenbankeintrag. |
db2Utility ist ein mächtiger SQL-Ausführer. Es unterscheidet nicht zwischen „nur mal testen“ und „DROP TABLE im falschen Schema“. Starte produktive Skripte nie ohne Bibliothekskontrolle, Backup-/Rollback-Gedanken und Protokollierung.3. Nicht verwechseln: Qshell db2, RUNSQLSTM, ACS und PASE db2util
Auf IBM i gibt es mehrere Wege, SQL auszuführen. Das ist gut – aber auch eine Quelle für Verwirrung, weil ähnlich klingende Werkzeuge nicht automatisch dasselbe tun.
| Werkzeug | Typischer Einsatz | Einordnung |
|---|---|---|
Qshelldb2 |
SQL direkt, interaktiv oder aus IFS-Datei ausführen. | Sehr praktisch für Skripte, kleine Automatisierungen und technische Tests. |
RUNSQLSTM |
SQL-Statements aus einer Source-File-Member- oder Stream-File-Quelle ausführen. | Klassischer IBM-i-Weg aus CL und Jobsteuerung. |
| ACS Run SQL Scripts | Interaktive Entwicklung, Explain, Ergebnisanzeige, komfortables Arbeiten. | Für Analyse und Entwicklung oft angenehmer als Shell. |
IBMdb2utilfür PASE |
Ähnlich zum Qshell-db2, aber für PASE gedacht. |
Interessant für PASE-/Open-Source-nahe Workflows, aber nicht dasselbe Tool. Das IBM-GitHub-Projekt ist inzwischen archiviert und read-only. |
db2ist nicht der Db2-LUW-Command-Line-Processor und auch nicht automatisch das PASE-Projektdb2util. Gleicher Namensraum, andere Welt. Auf IBM i zählt die jeweilige Dokumentation.4. Grundlagen: interaktiv, direkt oder aus Datei
Du kannst Qshell über den BefehlQSHstarten oder ein Qshell-Kommando direkt aus CL aufrufen. Für erste Tests reicht ein einfaches SELECT.
qsh
# Direktes SQL-Statement ausführen
db2 "select current date from sysibm.sysdummy1"
Wenn ein SQL-Statement Leerzeichen oder Shell-Sonderzeichen enthält, gehört es sauber in Anführungszeichen. Das ist keine IBM-i-Spezialschikane, sondern schlicht Shell-Alltag. Bei mehrzeiligen Statements behandelt das Utility außerdem einen Backslash am Zeilenende als Fortsetzungszeichen.
db2 -i
select current timestamp from sysibm.sysdummy1;
quit
Für echte Wiederholbarkeit sind SQL-Dateien meist besser als handgetippte Kommandos. Genau hier spielt das Utility seine Stärke aus.
db2 -t -v -f /home/deinuser/sql/createTables.sql
--. Zeilen mit!können Qshell-Kommandos ausführen, Zeilen mit@CL-Kommandos. Das ist mächtig, sollte aber in produktionsnahen Skripten bewusst und sparsam eingesetzt werden.5. Wichtige Optionen: -t, -f, -v, -S und Default Library
Die wichtigsten Optionen sind schnell erklärt, aber sie machen den Unterschied zwischen „funktioniert zufällig“ und „läuft reproduzierbar“.
| Option | Bedeutung | Praxis-Tipp |
|---|---|---|
-f filename |
Liest SQL-Statements aus einer Datei. | Ideal für Skripte im IFS. |
-t |
Semikolon als Statement-Terminator verwenden. | Für SQL-Dateien mit mehreren Statements fast immer sinnvoll. |
-T character |
Alternatives Terminator-Zeichen setzen. | Nützlich, wenn Semikolon im Kontext stört. |
-d |
Ausrufezeichen als Terminator verwenden. | Nischig, aber dokumentiert. |
-v |
SQL-Statements vor der Ausführung ausgeben. | Sehr hilfreich für Logs und Fehlersuche. |
-S |
Spaces und Padding in der Ausgabe unterdrücken. | Praktisch bei Text-/LOB-Ausgaben oder Weiterverarbeitung. |
default_lib |
Optionaler Parameter nach dem Dateinamen bei-f. |
Wirkt als Default Library/Schema für unqualifizierte Statements; vollständig qualifizierte Namen bleiben davon unberührt. |
db2 -t -v -f datei.sql. Manche Kurzformen wirken zwar vertraut, aber die IBM-Dokumentation beschreibt die Optionen einzeln. Lesbarkeit gewinnt.# Der zweite Parameter nach dem Dateinamen ist die Default Library.
# Das hilft bei unqualifizierten Tabellennamen im SQL-Skript.
db2 -t -v -f /home/deinuser/sql/createTables.sql MYLIB
SET SCHEMA YOUR_LIB;beginnt, musst DuYOUR_LIBvor der Ausführung durch Deine Testbibliothek ersetzen – oder das Schema bewusst auf andere Weise setzen. Der optionaledefault_lib-Parameter hilft vor allem bei unqualifizierten Objektnamen, ersetzt aber keine Platzhalter im SQL-Text.6. Das Beispiel-Repository: SQL-Skripte zum Rumtesten
Zum Artikel gibt es passende Beispielskripte im GitHub-RepositoryZeus-Commons-APIs. Du findest sie unterexamples/sqlScriptsSampleData/db2_400. Der Ordner enthält aktuell drei SQL-Dateien:createTables.sql,insertData.sqlunddropTables.sql. Der Aufbau ist bewusst überschaubar: Tabellen anlegen, Beispieldaten einfügen, Ergebnisse prüfen und danach wieder aufräumen.
db2Utility ausgeführt werden können. Sie sind kein produktives Deployment-Framework und gehören zuerst in eine eigene Testbibliothek.Der Aufbau ist absichtlich einfach gehalten:
createTables.sqllegt Beispieltabellen wieAGENTS,CUSTOMERS,ORDERS,AGENT_REVENUEsowie kleine EAV-Demotabellen an.insertData.sqllädt kompakte Beispieldaten in einer Reihenfolge, die zu den Foreign-Key-Beziehungen passt.dropTables.sqlräumt die Tabellen wieder auf und muss dabei die Abhängigkeiten beachten: Child-Tabellen werden vor Parent-Tabellen gelöscht.
SET SCHEMA YOUR_LIB;. Vor dem Test ersetzt DuYOUR_LIBdurch Deine eigene Testbibliothek, etwaTTDEMO. Danach laufen die unqualifizierten Tabellen- und Indexnamen sauber im gesetzten Schema.createTables.sql,insertData.sqlunddropTables.sqlsetzen jeweilsSET SCHEMA YOUR_LIB;. Das Cleanup-Skript entfernt inzwischen auchEAV_METADATA. Damit passt die Demo-Reihenfolge: anlegen, laden, prüfen, aufräumen.Beispiel: Cleanup-Reihenfolge
Beim Löschen zählt die tatsächliche Constraint-Abhängigkeit. In diesem Beispiel referenziertORDERSdie TabellenCUSTOMERSundAGENTS;CUSTOMERSreferenziert wiederumAGENTS. Deshalb wird zuerstORDERSgelöscht, danachCUSTOMERSund erst danachAGENTS. Die Summary-TabelleAGENT_REVENUEund die EAV-Demotabellen sind in diesem Beispiel unabhängig.
SET SCHEMA YOUR_LIB;
DROP TABLE ORDERS;
DROP TABLE CUSTOMERS;
DROP TABLE AGENTS;
DROP TABLE AGENT_REVENUE;
DROP TABLE EAV_DATA;
DROP TABLE EAV_METADATA;
Wenn Tabellen noch nicht existieren, kann ein einfaches Drop-Skript erwartbar mit Fehlern abbrechen oder Meldungen erzeugen. Für ein Lernbeispiel ist das okay, solange Du bewusst in einer Testbibliothek arbeitest. Für produktionsnahe Abläufe würdest Du zusätzlich mit Prüfungen, Rollback-Konzept, Protokollierung und Deployment-Regeln arbeiten.
7. Ein sauberer Praxis-Workflow mit SQL-Skripten
Für einen kleinen Testaufbau würde ich die Skripte heute in drei Phasen denken: vorbereiten, Schema-Platzhalter setzen, ausführen und prüfen.
Phase 1: Bibliothek vorbereiten
CRTLIB LIB(TTDEMO) TEXT('tiny-tool Demo library for Qshell db2 article')
Phase 2: Schema-Platzhalter im Skript ersetzen
Die Beispielskripte beginnen mitSET SCHEMA YOUR_LIB;. ErsetzeYOUR_LIBvor dem Ausführen durch Deine eigene Testbibliothek. Nicht in Produktion herumzaubern. Nicht „mal eben“ mit QGPL testen, weil es gerade bequem ist. Ja, QGPL ist geduldig. Genau das ist das Problem.
cd /home/deinuser/sql/db2_400
# Beispiel: neue Dateien für die Testbibliothek TTDEMO erzeugen
sed 's/SET SCHEMA YOUR_LIB/SET SCHEMA TTDEMO/g' createTables.sql > createTables_TTDEMO.sql
sed 's/SET SCHEMA YOUR_LIB/SET SCHEMA TTDEMO/g' insertData.sql > insertData_TTDEMO.sql
sed 's/SET SCHEMA YOUR_LIB/SET SCHEMA TTDEMO/g' dropTables.sql > dropTables_TTDEMO.sql
Phase 3: Skripte ausführen und prüfen
db2 -t -v -f /home/deinuser/sql/db2_400/createTables_TTDEMO.sql
db2 -t -v -f /home/deinuser/sql/db2_400/insertData_TTDEMO.sql
db2 -t -v "select count(*) as order_count from TTDEMO.ORDERS;"
-vGold wert, weil Du im Log siehst, welches Statement gerade ausgeführt wurde. Gerade bei mehrteiligen Skripten spart das später Nerven.8. Automatisieren aus CL, Qshell und Jobsteuerung
Du kannst das Utility direkt aus CL heraus starten. Das ist praktisch für kleine technische Jobs oder Abläufe, bei denen Du SQL-Skripte im IFS versionierst.
QSH CMD('db2 -t -v -f /home/deinuser/sql/db2_400/createTables_TTDEMO.sql')
Für wiederholbare Abläufe ist ein kleines Shell-Skript oft angenehmer. Dann kannst Du Pfade, Bibliothek und Logdatei an einer Stelle pflegen.
#!/bin/sh
set -e
LIB="TTDEMO"
BASE="/home/deinuser/sql/db2_400"
LOG="/home/deinuser/sql/db2_400/run_${LIB}.log"
{
echo "Start: $(date)"
db2 -t -v -f "${BASE}/createTables_${LIB}.sql"
db2 -t -v -f "${BASE}/insertData_${LIB}.sql"
db2 -t -v "select count(*) as order_count from ${LIB}.ORDERS;"
echo "End: $(date)"
} > "${LOG}" 2>&1
9. Ausgabe, Protokollierung und Fehleranalyse
Das Qshell-Utility ist schlicht. Das ist Stärke und Schwäche zugleich. Es gibt keine hübsche UI, keine magische Diagnose und keinen freundlichen Dialog, der Dich vor Deiner eigenen SQL-Datei rettet.
db2 -t -v -f /home/deinuser/sql/check.sql \
> /home/deinuser/sql/check.log 2>&1
Wenn Du Query-Ergebnisse maschinell weiterverarbeiten willst, hilft manchmal-S, weil Spaces und Padding reduziert werden. Für echte Schnittstellen würde ich trotzdem eher gezielt CSV, JSON, Views oder ein kleines Export-Programm bauen. Das Qshelldb2Utility ist ein Werkzeug für Ausführung und einfache Ausgabe – kein vollständiges ETL-Framework.
db2 -S "select agent_code, cumulative_revenue from TTDEMO.AGENT_REVENUE"
10. Sicherheit: Bibliotheken, Berechtigungen und Passwörter
Bei SQL-Skripten ist Sicherheit nicht nur ein Passwortthema. Der gefährlichste Fehler ist oft die falsche Bibliothek.
- Arbeite mit Testbibliotheken:Für Beispiele und Blog-Code niemals produktive Libraries verwenden.
- Qualifiziere bewusst:Entweder explizit
MYLIB.TABLEoder bewusst unqualifiziert mit Default Library. - Prüfe Drop-Skripte doppelt:Besonders bei generischen Namen wie
ORDERS,CUSTOMERSoderTEST. - Keine Passwörter in Skripte:Die Optionen
-uund-pgehören in den Remote-Kontext mit-r. Klartextpasswörter in Skripten sind keine gute Idee. - Berechtigungen minimal halten:Ein technischer User für DDL braucht andere Rechte als ein User für Read-only-Checks.
db2Utility mit der lokalen Datenbank. Für Remote-Verbindungen gibt es-rmit einem relationalen Datenbanknamen ausWRKRDBDIRE; Benutzer und Passwort sind nur in diesem Remote-Kontext relevant.11. Best Practices
- Nutze
db2 -t -v -f script.sqlfür mehrteilige SQL-Dateien. - Versioniere SQL-Skripte im Git-Repository, nicht in privaten Notizzetteln.
- Trenne
create,insert,checkunddroplogisch. - Ersetze Platzhalter wie
YOUR_LIBkontrolliert und sichtbar. - Nutze eine eigene Testbibliothek für Demos und Artikelbeispiele.
- Lege Foreign Keys bewusst an und lösche Child-Tabellen vor Parent-Tabellen.
- Schreibe Logs, besonders bei automatisierten Jobs.
- Baue Prüf-SELECTs ein, damit ein Skript nicht nur „durchläuft“, sondern auch plausibel ist.
- Speichere keine Passwörter im Klartext in Shell- oder SQL-Dateien.
- Nutze ACS oder Visual Explain, wenn es um SQL-Analyse und Performance geht.
12. Fazit
db2Utility ist kein glamouröses Tool – und genau das macht es sympathisch. Es führt SQL aus, direkt oder aus Dateien, lokal oder bei Bedarf remote, schlicht und skriptbar. Für IBM-i-Developer ist es ein starkes Werkzeug, wenn SQL-Skripte wiederholbar laufen sollen: Testdaten aufbauen, DDL ausführen, kleine Checks automatisieren oder Demo-Umgebungen vorbereiten. Der Unterschied zwischen Bastellösung und professionellem Ablauf liegt nicht im Tool, sondern in Disziplin: richtige Bibliothek, saubere Terminatoren, versionierte Skripte, Logs, Fehlerprüfung und kein blindes Vertrauen in Copy-and-paste. Kurz: Qshelldb2ist klein. Aber wenn Du es sauber einsetzt, ist es verdammt nützlich.Glossar
Zentrale Begriffe aus dem Artikel – kompakt erklärt.
- ACS
- IBM i Access Client Solutions; Client-Tool für SQL, Administration, 5250-Sitzungen und weitere IBM-i-Funktionen.
- AS/400
- Historischer Plattformname. Heute spricht man fachlich korrekt von IBM i auf IBM Power.
- CL
- Control Language auf IBM i; wird häufig für Jobsteuerung, Systembefehle und Automatisierung genutzt.
- CLI
- Call Level Interface; Schnittstelle, die vom Qshell
db2Utility für SQL-Zugriffe genutzt wird. - Db2 for i
- Die integrierte relationale Datenbank der IBM-i-Plattform.
- Default Library
- Bibliothek bzw. Schema, in dem unqualifizierte SQL-Objektnamen aufgelöst werden.
- IFS
- Integrated File System auf IBM i. Dort liegen Stream Files wie Shell-Skripte, SQL-Dateien oder Git-Checkouts.
- Qshell
- Unix-ähnliche Shell- und Skriptumgebung auf IBM i, aufrufbar zum Beispiel mit
QSH. - RUNSQLSTM
- IBM-i-Befehl zum Ausführen von SQL-Statements aus einer Quelle, häufig aus CL-Jobs genutzt.
- Terminator
- Zeichen, mit dem SQL-Statements in einer Datei abgeschlossen werden, häufig das Semikolon.
- WRKRDBDIRE
- IBM-i-Befehl zur Verwaltung relationaler Datenbankeinträge; relevant für Remote-Datenbankverbindungen.



tiny-tool.de
tiny-tool.de