惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

C
Check Point Blog
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
博客园 - 聂微东
月光博客
月光博客
博客园 - 司徒正美
爱范儿
爱范儿
aimingoo的专栏
aimingoo的专栏
量子位
Recent Announcements
Recent Announcements
V
V2EX
P
Proofpoint News Feed
小众软件
小众软件
云风的 BLOG
云风的 BLOG
腾讯CDC
宝玉的分享
宝玉的分享
Microsoft Azure Blog
Microsoft Azure Blog
大猫的无限游戏
大猫的无限游戏
Vercel News
Vercel News
The GitHub Blog
The GitHub Blog
A
About on SuperTechFans
B
Blog
博客园_首页
GbyAI
GbyAI
博客园 - Franky

IT Jungle

Finally: Some Pricing Information On The Power S1112 Entry Server - IT Jungle Rocket Automates Manual IBM i Tasks With AI - IT Jungle Guru: Where’s The Table? - IT Jungle LaserVault Goes iSCSI With Virtual Tape Library - IT Jungle IBM i PTF Guide, Volume 28, Number 31 - IT Jungle Will Power Chips Get A Converged Arm Instruction Set Like Z Mainframe CPUs? - IT Jungle Thinking About Moving IBM i To The Cloud? Don't Start With The Quote - IT Jungle Precisely To Add Ransomware Protection In MIMIX 11 - IT Jungle It’s D-Day For Cybersecurity, AI Firms Warn - IT Jungle IBM i PTF Guide, Volume 28, Number 30 - IT Jungle Oracle Dips A Toe Into IBM’s EBCDIC World - IT Jungle When Your Small IBM i Team Is Really A Team Of One - IT Jungle Guru: Putting Failure Handling In Its Place - IT Jungle Inside The Security Enhancements In ACS - IT Jungle IBM i PTF Guide, Volume 28, Number 28: A Crazy Number of Security Vulnerability Patches - IT Jungle IBM i PTF Guide, Volume 28, Number 29 - IT Jungle IBM i PTF Guide, Volume 28, Number 28: A Crazy Number of Security Vulnerability Patches - IT Jungle Inside The Encryption Key Management Changes In IBM i 7.6 - IT Jungle FalconStor Moved To The Blue Lagoon, And Is Poised For Growth Because Of It - IT Jungle Guru: Claude’s SQL Tip - IT Jungle Astera Makes Extracting Legacy Report Data an AI Specialty - IT Jungle IBM i PTF Guide, Volume 28, Number 27 - IT Jungle Welcoming The New IBM i Chief Architect And Other New Top Brass - IT Jungle A Deep Dive Into That Power S1112 Entry Power11 Server - IT Jungle How IBM Bolstered IBM i Resilience In The Summer Tech Refreshes - IT Jungle IBM i PTF Guide, Volume 28, Number 26 - IT Jungle Power Systems Has A Great Quarter; System Z, Not So Much - IT Jungle Does AI Mark The End Of The ERP Era? - IT Jungle Guru: Deterministic Application Development With AI - IT Jungle What IBM’s Got Cooking In Db2 For i In The Summer TRs - IT Jungle
Guru: Beyond Three-Part Naming – Running SQL Across Remot...
Gregory Simmons · 2026-08-03 · via IT Jungle

August 3, 2026

In my article Guru: Finding Data in The Forest – Exploring Three-Part Naming In SQL, I helped you to get started with three-part naming. If you have a network of IBM i systems and haven’t availed yourself of this capability, you may be surprised at just how powerful it can be. Instead of relying on data transfers, replication, or intermediate files, SQL can reach directly into remote systems as though the data were local.

That works well when you know exactly which remote system contains the data you need. But what happens when your network grows from a handful of systems to dozens spread across the country? Suddenly, manually writing queries against each remote database becomes tedious and difficult to maintain.

In today’s example, I want to take the next step by demonstrating a reusable SQL procedure that can execute the same query across every relational database directory entry on your IBM i partition. Rather than manually querying each system one at a time, we can dynamically loop through the network, execute the SQL remotely, and consolidate the results into a single table for analysis. For example:

1  CREATE OR REPLACE PROCEDURE RN_MLT_QRY
2  (
3      IN p_query        VARCHAR(10000),
4      IN p_output_table VARCHAR(10)
5  )
6  LANGUAGE SQL
7  MODIFIES SQL DATA
8  SET OPTION
9    COMMIT = *NONE,
10   DBGVIEW = *SOURCE
    
11 BEGIN
12   DECLARE v_system     VARCHAR(50) DEFAULT '';
13   DECLARE v_sql        VARCHAR(10000);
14   DECLARE v_first      SMALLINT DEFAULT 1;
15   DECLARE v_full_table VARCHAR(300);
16   DECLARE v_system_sql VARCHAR(10000);
17   DECLARE v_loop_query VARCHAR(10000);
18   DECLARE SQLState     CHAR(5);
19   DECLARE SQLCode      INT;

20   DECLARE cur_systems CURSOR FOR 
21     select distinct RDB_NAME 
22     from qsys2.RDB_ENTRY_INFO 
23     order by RDB_NAME;

24   SET v_full_table = 'QTEMP.' || TRIM(p_output_table);

25   OPEN cur_systems;

26   FETCH_LOOP:
27   LOOP

28     FETCH cur_systems INTO v_system;

29     IF SQLSTATE <> '00000' THEN
30       LEAVE FETCH_LOOP;
31     END IF;

32     SET v_loop_query = REPLACE(p_query, '{{SYSTEM}}', v_system);

33     IF v_first = 1 THEN
34       SET v_sql = 'CREATE TABLE ' || v_full_table ||
35           ' AS (SELECT T.*, ''' || v_system || ''' AS SOURCE_SYSTEM ' ||
36           'FROM (' || v_loop_query || ') T) WITH DATA';
                
37       EXECUTE IMMEDIATE v_sql;
38       set v_first = 0;
39     ELSE
40       SET v_sql = 'INSERT INTO ' || v_full_table ||
41           ' SELECT T.*, ''' || v_system || ''' AS SOURCE_SYSTEM ' ||
42           'FROM (' || v_loop_query || ') T';

43       EXECUTE IMMEDIATE v_sql;
44     END IF;

45   END LOOP;

46   CLOSE cur_systems;
47 END;

The procedure begins on lines 20 through 23 by declaring a cursor over QSYS2.RDB_ENTRY_INFO. This system catalog contains the relational database directory entries configured on the partition. In other words, this is the list of remote systems we want to query.

Line 24 builds the fully qualified QTEMP table name that will ultimately hold the consolidated results from all systems.

Lines 25 through 45 form the heart of the procedure. As the cursor iterates through each relational database entry, line 32 replaces the {{SYSTEM}} substitution variable in the incoming SQL statement with the current relational database name. This allows the same query template to be dynamically redirected to each remote system during execution.

The first iteration through the loop behaves slightly differently than the rest. On lines 33 through 38, the procedure creates the output table using CREATE TABLE AS. This establishes the structure of the final result set while also loading the first system’s data.

Every iteration afterward uses the INSERT statement on lines 40 through 43 to append additional rows into the same table. Notice that each query also adds a SOURCE_SYSTEM column. This makes it easy to identify which IBM i partition supplied each row in the final results.

The dynamic SQL itself is executed using EXECUTE IMMEDIATE, allowing the procedure to construct and run SQL statements at runtime based on the current relational database entry being processed. Using the above procedure is as follows:

1 Drop Table qtemp.local_log; 

2 CALL RN_MLT_QRY('select *                                                  
3                  from {{SYSTEM}}.MUSHLIB.FORAGE_LOG 
4                  Limit 100’,
5                 'LOCAL_LOG'); 

6 Select * From qtemp.local_log
7 Order by SOURCE_SYSTEM;

On line 1, I’m simply dropping the table because the SQL procedure will attempt to create it during the first iteration through the cursor. Yes, you can (and probably should) include that logic directly within the SQL procedure itself to make the interface cleaner. There are many additional “nice to haves” that could improve this procedure considerably, but for purposes of this demonstration, I intentionally kept the example short and focused.

Lines 2 through 5 demonstrate the call to RN_MLT_QRY. Notice that the first parameter contains the SQL statement we want executed across all remote databases. The FROM clause contains the {{SYSTEM}} substitution variable, which will be replaced with the current relational database name as the procedure iterates through the cursor.

And finally, lines 6 and 7 are where you can, at last, find out how the mushroom foraging is happening across all 50 states.

Until next time, happy coding.

Gregory Simmons is a Project Manager with PC Richard & Son. He started on the IBM i platform in 1994, graduated with a degree in Computer Information Systems in 1997 and has been working on the OS/400 and IBM i platform ever since. He has been a registered instructor with the IBM Academic Initiative since 2007, an IBM Champion and holds a COMMON Application Developer certification. When he’s not trying to figure out how to speed up legacy programs, he enjoys speaking at technical conferences, running, backpacking, hunting, and fishing.

RELATED STORIES

Guru: Finding Data In The Forest – Exploring Three-Part Naming In SQL

Guru: SQL Sequences In RPG Let Db2 Handle The Counting

Guru: IBM i Job Log Detective Brings Structure To Job Log Analysis In VS Code

Guru: Managing The Lifecycle Of Your Service Programs – Updates Without Chaos

Guru: Are Binding Directories A Shortcut Or A Source Of Chaos?

Guru: Service Programs And Activation Groups – Design Decisions That Matter

Guru: Binder Source Is Your Service Program’s Owner’s Manual

Guru: Access Client Solutions 1.1.9.11 – Security First, With Continued Investment In SQL Tooling

Guru: Taming The CRTSRVPGM Command – Options That Can Save Your Sanity

Guru: CRTSRVPGM Parameters That Can Save or Sink You

Guru: A First Look at Bob, The IBM i Assistant That’s Closer Than You Think

Bob More Than Just A Code Assistant, IBM i Chief Architect Will Says

IBM Pulls The Curtain Back A Smidge On Project Bob

Big Blue Converges IBM i RPG And System Z COBOL Code Assistants Into “Project Bob”

Guru: When Attention Turns To You – Writing Your Own ATTN Program

Guru: WCA4i And Granite – Because You’ve Got Bigger Things To Build

Guru: When Procedure Driven RPG Really Works

Guru: Unlocking The Power Of %CONCAT And %CONCATARR In RPG

Guru: AI Pair Programming In RPG With Continue

Guru: AI Pair Programming In RPG With GitHub Copilot

Guru: RPG Receives Enumerator Operator

Guru: RPG Select Operation Gets Some Sweet Upgrades

Guru: Growing A More Productive Team With Procedure Driven RPG

Guru: With Procedure Driven RPG, Be Precise With Options(*Exact)

Guru: Testing URLs With HTTP_GET_VERBOSE

Guru: Fooling Around With SQL And RPG

Guru: Procedure Driven RPG And Adopting The Pillars Of Object-Oriented Programming

Guru: Getting Started With The Code 4 i Extension Within VS Code

Guru: Procedure Driven RPG Means Keeping Your Variables Local

Guru: Procedure Driven RPG With Linear-Main Programs

Guru: Speeding Up RPG By Reducing I/O Operations, Part 2

Guru: Speeding Up RPG By Reducing I/O Operations, Part 1

Guru: Watch Out For This Pitfall When Working With Integer Columns