Qshell db2 Utility on IBM i – Run, Automate & Validate SQL Scripts the Right Way

Compact, scriptable, and surprisingly powerful. How to use the Qshell db2 utility properly — with real-world gotchas, practical examples, and a clean workflow.
1. What is the Qshell db2 Utility?
Qshell is the Unix-like shell and scripting environment on IBM i. The db2 utility that comes with it is a command-line tool for Db2 for i. It uses the SQL CLI and lets you run SQL statements directly, interactively, or from a file in the IFS.
db2 utility is a lightweight SQL runner for IBM i. Use it to quickly test queries, execute SQL scripts from the IFS, set up small automation tasks, or embed database actions into technical workflows.This becomes especially handy when you already keep your SQL scripts in the IFS — whether under /home/youruser/sql, in a Git checkout, a deployment folder, or a test environment.
2. When Is It Actually Useful?
This tool isn’t meant to replace IBM i Access Client Solutions, Navigator for i, or proper deployment processes. But it’s incredibly useful when you want to run simple SQL actions reliably and repeatedly.
| Use Case | Why Qshell db2 Fits Well | What to Watch Out For |
|---|---|---|
| Setting up sample data | Scripts with CREATE TABLE and INSERT run quickly and repeatably. |
Manage your library carefully. Watch constraint order and drop sequence. |
| Technical testing | SQL can run reproducibly straight from files. | Always check output and exit codes — don’t just assume “it worked”. |
| Ad-hoc analysis | Quick SELECT statements are easy to test on the command line. | Handle shell characters and quoting properly. |
| Automation | Qshell commands can be called from CL or scheduled jobs. | Plan for logging, proper authorities, and error handling. |
| Local IBM i database work | The utility connects to the local database with no extra configuration. | Remote access requires a proper relational database directory entry. |
db2 utility is a powerful SQL executor. It doesn’t distinguish between “just testing” and “dropping the wrong table in production.” Never run production scripts without proper library control, backup/rollback planning, and logging.3. Don’t Confuse It With: RUNSQLSTM, ACS, and PASE db2util
There are several ways to run SQL on IBM i. That’s great — but it’s also a common source of confusion because similarly named tools don’t necessarily do the same thing.
| Tool | Typical Use | How It Fits In |
|---|---|---|
Qshell db2 |
Run SQL directly, interactively, or from an IFS file. | Excellent for scripts, light automation, and technical testing. |
RUNSQLSTM |
Execute SQL statements from a source file member or stream file. | The classic IBM i approach, especially from CL and job control. |
| ACS Run SQL Scripts | Interactive development, visual explain, result display, comfortable editing. | Often more pleasant than the shell for analysis and development work. |
| IBM db2util (PASE) | Similar to Qshell db2, but built for the PASE environment. | Interesting for PASE / open-source-style workflows. Note: The original IBM GitHub project is now archived and read-only. |
db2 is not the Db2 LUW Command Line Processor, and it’s not automatically the same as the PASE project db2util. Same name space, different world. On IBM i, always check the official documentation for the tool you’re actually using.4. Basics: Interactive, Direct, or From a File
You can start Qshell with the QSH command or call a Qshell command directly from CL. For quick tests, a simple SELECT is all you need.
qsh
# Run a direct SQL statement
db2 "select current date from sysibm.sysdummy1"
If your SQL statement contains spaces or shell special characters, wrap it in quotes. This isn’t some IBM i quirk — it’s just how shells work. For multi-line statements, the utility also treats a backslash at the end of a line as a continuation character.
db2 -i
select current timestamp from sysibm.sysdummy1;
quit
For real repeatability, SQL files are almost always better than typing commands by hand. This is where the utility really shines.
db2 -t -v -f /home/youruser/sql/createTables.sql
--. Lines starting with ! can execute Qshell commands, and lines starting with @ can run CL commands. This is powerful, but in production-grade scripts you should use these features deliberately and sparingly.5. Key Options: -t, -f, -v, -S and Default Library
The most important options are straightforward, but they’re what separate “it worked by accident” from “it runs reliably every time.”
| Option | Meaning | Practical Tip |
|---|---|---|
-f filename |
Read SQL statements from a file. | Perfect for scripts stored in the IFS. |
-t |
Use semicolon as the statement terminator. | Almost always the right choice for SQL files with multiple statements. |
-T character |
Set an alternative terminator character. | Useful when semicolons cause issues in your context. |
-d |
Use exclamation mark as terminator. | Niche, but documented. |
-v |
Print SQL statements before executing them. | Extremely helpful for logs and troubleshooting. |
-S |
Suppress spaces and padding in output. | Useful with text/LOB output or when piping results. |
default_lib |
Optional second parameter after the filename with -f. |
Sets the default library/schema for unqualified object names. Fully qualified names are unaffected. |
db2 -t -v -f script.sql. Some people use short forms out of habit, but the IBM documentation lists them individually. Readability wins.# The second parameter after the filename sets the default library.
# This helps when your SQL script uses unqualified table names.
db2 -t -v -f /home/youruser/sql/createTables.sql TTDEMO
SET SCHEMA YOUR_LIB;, you still need to replace YOUR_LIB with your actual test library (e.g. TTDEMO) before running it. The optional parameter mainly helps with unqualified object names — it doesn’t do string substitution inside the SQL.6. Example Repository: SQL Scripts You Can Test Right Now
Alongside this article you’ll find matching example scripts in the Zeus-Commons-APIs GitHub repository under examples/sqlScriptsSampleData/db2_400. The folder contains several SQL files, including createTables.sql, insertData.sql, and dropTables.sql. The structure is intentionally simple: create tables, load sample data, verify results, then clean everything up.
db2 utility. They are not a production deployment framework. Always run them first in a dedicated test library.The scripts are deliberately straightforward:
createTables.sqlcreates sample tables such asAGENTS,CUSTOMERS,ORDERS,AGENT_REVENUE, plus small EAV demo tables.insertData.sqlloads compact sample data in an order that respects foreign key relationships.dropTables.sqlcleans up the tables while respecting dependencies (child tables are dropped before parent tables).
SET SCHEMA YOUR_LIB;. Before testing, replace YOUR_LIB with your own test library (for example TTDEMO). After that, all unqualified table and index names will resolve cleanly in the schema you set.createTables.sql, insertData.sql, and dropTables.sql all use SET SCHEMA YOUR_LIB;. The cleanup script also removes EAV_METADATA. This gives you a clean demo flow: create → load → verify → clean up.Example: Proper Drop Order
When dropping tables, the actual constraint dependencies matter. In this example, ORDERS references both CUSTOMERS and AGENTS, and CUSTOMERS references AGENTS. Therefore we drop ORDERS first, then CUSTOMERS, then AGENTS. The summary table AGENT_REVENUE and the EAV demo tables have no dependencies in this setup.
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;
If tables don’t exist yet, a simple drop script will produce expected errors or messages. For a learning example that’s perfectly fine — as long as you’re working in a test library. For anything closer to production you would add existence checks, rollback logic, proper logging, and deployment rules.
7. A Clean, Practical Workflow with SQL Scripts
For a small test setup I like to think in three clear phases: prepare, replace schema placeholders, execute and verify.
Phase 1: Prepare the library
CRTLIB LIB(TTDEMO) TEXT('Demo library for Qshell db2 examples')
Phase 2: Replace schema placeholders in the scripts
The example scripts start with SET SCHEMA YOUR_LIB;. Replace it with your test library before running anything. Don’t experiment in QGPL just because it’s convenient right now. QGPL is patient — that’s exactly the problem.
cd /home/youruser/sql/db2_400
# Create library-specific copies for TTDEMO
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: Execute and verify
db2 -t -v -f /home/youruser/sql/db2_400/createTables_TTDEMO.sql
db2 -t -v -f /home/youruser/sql/db2_400/insertData_TTDEMO.sql
db2 -t -v "select count(*) as order_count from TTDEMO.ORDERS;"
-v is gold. You can see in the log exactly which statement is being executed right now. This saves a lot of head-scratching later with multi-step scripts.8. Automating from CL, Qshell & Job Scheduler
You can call the utility directly from CL. This is handy for small technical jobs or when you version your SQL scripts in the IFS.
QSH CMD('db2 -t -v -f /home/youruser/sql/db2_400/createTables_TTDEMO.sql')
For repeatable flows, a small shell script is often more comfortable. You can keep paths, library, and log file in one place.
#!/bin/sh
set -e
LIB="TTDEMO"
BASE="/home/youruser/sql/db2_400"
LOG="/home/youruser/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. Output, Logging & Troubleshooting
The Qshell utility is deliberately simple. That’s both its strength and its weakness. There’s no pretty UI, no magic diagnostics, and no friendly dialog that saves you from your own SQL file.
db2 -t -v -f /home/youruser/sql/check.sql \
> /home/youruser/sql/check.log 2>&1
If you want to process query results programmatically, -S can help by reducing spaces and padding. For real interfaces I usually prefer generating CSV or JSON explicitly, using views, or writing a small export program. The Qshell db2 utility is great for execution and simple output — it’s not a full ETL framework.
db2 -S "select agent_code, cumulative_revenue from TTDEMO.AGENT_REVENUE"
10. Security: Libraries, Authorities & Passwords
With SQL scripts, security isn’t just about passwords. The most dangerous mistake is often using the wrong library.
- •Work with test libraries: Never use production libraries for examples or blog code.
- •Qualify objects deliberately: Either use explicit
MYLIB.TABLEor consciously work unqualified with a default library. - •Double-check drop scripts: Especially with generic names like
ORDERS,CUSTOMERS, orTEST. - •Never store passwords in scripts: The
-uand-poptions belong in remote connection context with-r. Clear-text passwords in scripts are a bad idea. - •Keep authorities minimal: A technical user for DDL needs different rights than a read-only check user.
db2 utility connects to the local database. For remote connections use -r together with a relational database name from WRKRDBDIRE. User ID and password are only relevant in that remote context.11. Best Practices
- Use
db2 -t -v -f script.sqlfor multi-statement SQL files. - Version your SQL scripts in Git — not in random text files or notes.
- Separate
create,insert,check, anddroplogically. - Replace placeholders like
YOUR_LIBin a controlled and visible way. - Always use a dedicated test library for demos and examples.
- Create foreign keys deliberately and drop child tables before parent tables.
- Write logs, especially for automated jobs.
- Include verification SELECT statements so a script doesn’t just “run” but is also plausible.
- Never store passwords in clear text in shell or SQL files.
- Use ACS or Visual Explain when you need SQL analysis and performance insights.
12. Final Thoughts
The Qshell db2 utility isn’t a flashy tool — and that’s exactly what makes it likable. It runs SQL, directly or from files, locally or remotely when needed. It’s simple and scriptable.
For IBM i developers it’s a strong tool whenever SQL scripts need to run repeatably: building test data, executing DDL, automating small checks, or preparing demo environments.
The difference between a quick hack and a professional process doesn’t come from the tool itself — it comes from discipline: using the right library, proper terminators, versioned scripts, logging, error checking, and never blindly trusting copy-and-paste.
In short: Qshell db2 is small. But when you use it properly, it’s remarkably useful.
Glossary
Key terms from this article, explained simply.
- ACS
- IBM i Access Client Solutions — the main client tool for SQL, administration, 5250 sessions, and many other IBM i functions.
- AS/400
- Historical platform name. Today we correctly refer to it as IBM i on IBM Power.
- CL
- Control Language on IBM i — commonly used for job control, system commands, and automation.
- CLI
- Call Level Interface — the interface used by the Qshell
db2utility to access SQL. - Db2 for i
- The integrated relational database that comes with the IBM i platform.
- Default Library
- The library (schema) used to resolve unqualified SQL object names.
- IFS
- Integrated File System on IBM i. This is where stream files, shell scripts, SQL files, and Git checkouts live.
- Qshell
- The Unix-like shell and scripting environment on IBM i, started for example with
QSH. - RUNSQLSTM
- IBM i command to execute SQL statements from a source — frequently used from CL jobs.
- Terminator
- The character that marks the end of an SQL statement in a file (usually the semicolon).
- WRKRDBDIRE
- IBM i command to manage relational database directory entries — relevant for remote database connections.
Sources & Further Reading
Transparency Notice
The content on tiny-tool.de is carefully researched, editorially reviewed, and updated on a regular basis. Sources and quotations are provided in a transparent and traceable manner. However, we do not guarantee the accuracy, completeness, or timeliness of the information provided. Errors cannot be ruled out.
Authorship & Editorial Support: Texts published on tiny-tool.de are original editorial works created by our team (final editorial responsibility: Guido Zeuner). Digital tools — including AI-based assistance systems — may be used solely as support tools for research, structuring, or language refinement. The selection of content, structure, reasoning, and final wording are created and approved by us as natural persons; AI systems are not authors.
Audience Measurement (VG Wort / METIS): To measure text reach, tracking pixels provided by VG Wort are used. For technical reasons, these tracking marks are loaded when the page is accessed and currently cannot be blocked through the cookie banner, as no cookies are set. The measurement is used exclusively for reach statistics; no personal profiles are created. More information is available in our Privacy Notice.
Please note: The content provided on this website is for general informational purposes only and does not constitute professional advice of any kind, including legal, tax, financial, or other specialist advice. Use of the content is at your own risk. Liability for material or immaterial damages is excluded, except in cases of intentional misconduct or gross negligence.
Advertising & Affiliate Links: Some posts may contain promotional references or so-called affiliate links. These are identified accordingly. Clicking such links does not result in any additional cost to you; we may receive a small commission.
Trademark Notice: All brand names, logos, and product names are the property of their respective rights holders and are used solely for identification and descriptive purposes. No affiliation with the companies mentioned is implied.
External Links: This website contains links to external third-party websites. Although we review links carefully, we assume no responsibility for the content of external websites. If we become aware of unlawful content, we will remove the respective links without undue delay.



tiny-tool.de
tiny-tool.de