• The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
Menu
  • The Four Hundred
  • Subscribe
  • Media Kit
  • Contributors
  • About Us
  • Contact
  • Search SQL Source Using System Catalogs

    May 15, 2013 Michael Sansoterra

    The green screen PDM and the GUI Rational Developer for i (RDi) tools provide developers an easy way to search through source code to find a specified text literal. But what if these tools don’t have access to all your code, in particular the SQL code? Many developers may not be keeping an up-to-date source copy of their SQL persisted stored modules (functions, procedures and triggers) and further, may not be keeping a copy of the source at all. If this is the case in your shop, never fear, for DB2 for i maintains a record of the source statements in each SQL-based object that it creates. This information is stored in the DB2 catalog views and can be easily queried.

    If you’ve never used them, the DB2 catalog tables and views contain the metadata about your databases. Within them you can find all table names, column names and data types, stored procedure names, registered Java JARs, etc. If you’ve ever wondered where an ODBC- or JDBC-based database tool gets its information about the tables and columns in your database, the answer is from these catalog views.

    As long as the SQL source hasn’t been obfuscated, the SQL source code for an SQL object is stored in one of the following catalogs. (Remember, these catalogs don’t include the source for external routines written in C, COBOL, RPG, or Java.)




    Routine Type

    Routine Type

    System Catalog

    Column containing SQL source

    Trigger

    SYSTRIGGERS

    ACTION_STATEMENT

    Stored Procedure

    SYSPROCS

    ROUTINE_DEFINITION

    User-Defined Function

    SYSFUNCS

    ROUTINE_DEFINITION

    These catalogs are located in schema QSYS2. An additional catalog view called SYSROUTINES contains data for both procedures and functions. (In this tip, I use the term “routine” to also include SQL triggers.)

    Keep in mind that for older versions of IBM i OS (a.k.a. OS/400), these views may be incomplete for very large routines. For example, in V5R3, the ROUTINE_DEFINITION column in SYSPROCS was defined as VARCHAR(24000). If the routine source was longer than 24K, then this column would contain a NULL. In V7R1 (i7.1) the data type of this column is DBCLOB(2M). Unless IBM has some source recovery magic that is run during an OS upgrade, I’m guessing a stored procedure with 26KB of source created on V5R3 would not be present in the system catalog after the system was upgraded to i6.1 or i7.1. If nothing else, this is a good reason to ALWAYS keep a separate copy of your SQL source code.

    Finally, note that the SQL source columns only contain the code embedded in the routine’s body. The CREATE statement and other options are not recorded in the source column (although this info can be found elsewhere in the system catalogs.)

    For example, for this simple SQL based user-defined function:

    CREATE FUNCTION DEV.TEST1 ()
    RETURNS INT
    LANGUAGE SQL
    BEGIN
        RETURN 1;
    END
    

    The SYSFUNCS catalog’s ROUTINE_DEFINITION column will only contain the following text:

    BEGIN
        RETURN 1;
    END
    

    To recover the full text of an SQL object’s source, including the CREATE statement and other options, use System i Navigator or use a command line utility like GENDDL that uses the Generate Data Definition Language (QSQGNDDL) API. But I’m digressing, as this tip is about finding where certain text lies within your SQL source kingdom.

    So if you want to find where the text RECEIPT ID is used in within your SQL routines, how do you search them when the source is incomplete or missing? Shown here is a starter query that can be used as a basis to search the three system catalogs to identify routines that contain a specified literal to find:

    -- Remove the UCASE functions if the search should be
    -- case sensitive
    WITH FIND_TEXT AS (
    -- Include one or more search strings here
    SELECT UCASE(FIND_VALUE) AS FIND_VALUE
      FROM (VALUES('%RECEIPT ID%')) SINGLE_ROW (FIND_VALUE)  
    )
    SELECT SPECIFIC_SCHEMA,SPECIFIC_NAME,ROUTINE_NAME,
    ROUTINE_DEFINITION,
           'Procedure' AS TYPE
      FROM FIND_TEXT, QSYS2.SYSPROCS
     WHERE UCASE(ROUTINE_DEFINITION) LIKE FIND_VALUE
    UNION ALL
    SELECT SPECIFIC_SCHEMA,SPECIFIC_NAME,ROUTINE_NAME,
    ROUTINE_DEFINITION,
           CASE FUNCTION_TYPE 
           WHEN 'S' THEN 'Scalar Function' 
           WHEN 'T' THEN 'Table Function' 
           ELSE 'Function' END AS TYPE
      FROM FIND_TEXT, QSYS2.SYSFUNCS
     WHERE UCASE(ROUTINE_DEFINITION) LIKE FIND_VALUE
    UNION ALL
    SELECT TRIGGER_SCHEMA,TRIGGER_NAME,TRIGGER_NAME,
    ACTION_STATEMENT,
           'TRIGGER' AS TYPE
      FROM FIND_TEXT, QSYS2.SYSTRIGGERS
     WHERE UCASE(ACTION_STATEMENT) LIKE FIND_VALUE
    

    Pretty easy stuff. One drawback is that this query only returns the routine name that contains the text. It returns the entire SQL text as a large string in a single row, but a developer can’t easily spot where the requested text lies. Unlike PDM and RDi, it doesn’t show a specific line of text in the results, which is often useful, especially if the requested search text occurs multiple times in a single source member.

    This situation can easily be remedied by writing a recursive table function to split the source-code based on a line break character into individual source lines. Or, writing an external user-defined table function in a language like RPG or Java that will parse text data will accomplish the same thing. When this “splitter” table function is applied to the catalog views, the source code will be broken up line by line so that each line of source will have its own row in the query results.

    If you’re on IBM i7.1 with the latest DB2 Group PTF, you can implement a hack to let the new XMLTABLE table function do the dirty work of splitting the rows for you without writing a separate function. The following CTE query will XML-ify the SYSPROCS ROUTINE_DEFINITION column by inserting a <Source> root tag and multiple <Line> tags whenever there is a line feed character detected in the SQL source. Once the source is in this XML format, XMLTABLE can be used to split the source code so that each line of source gets its own row in the result set.

    For simplicity, this query only examines SYSPROCS, but it can be expanded to record all three catalog views:

    -- Assume an embedded LF as a line separator  (EBCDIC X'25')
    WITH SOURCE_XML AS (
    SELECT SPECIFIC_SCHEMA,SPECIFIC_NAME,ROUTINE_NAME,
    XMLPARSE(DOCUMENT '<Source><Line>'||REPLACE
    (ROUTINE_DEFINITION,X'25',
    '</Line><Line>') ||'</Line></Source>') AS 
    ROUTINE_DEFINITION,
           'Procedure' AS TYPE
      FROM QSYS2.SYSPROCS
    WHERE SPECIFIC_SCHEMA='DEV' -- Your library goes here
    ),
    SOURCE_LINES AS (
    SELECT SPECIFIC_SCHEMA,SPECIFIC_NAME,ROUTINE_NAME,TYPE,
    LINE_NO,SOURCE
    FROM SOURCE_XML, XMLTABLE(
    '$doc/Source/Line' 
    PASSING SOURCE_XML.ROUTINE_DEFINITION AS "doc"
    COLUMNS 
    Line_No FOR ORDINALITY,
    Source VARCHAR(32000)  PATH '.'
    ) AS SOURCE_LINES
    )
    SELECT *
      FROM SOURCE_LINES
     WHERE UCASE(SOURCE) LIKE '%RECEIPT ID%';
    

    Nothing to it!

    In addition to literals, tools like RDi can also search for regular expression patterns. It just so happens that SQL can be enhanced (using a language like Java or C) so that it can utilize regular expression functionality. With a regular expression capable user-defined function like re_Test, the catalog search query can also utilize the power of a regular expression pattern match just like RDi can do.

    The catalog views provide a wealth of information about the databases you work with, including information about the code. Use these views to aid the many database administration tasks that developers and DBAs face.

    Michael Sansoterra is a DBA for Broadway Systems in Grand Rapids, Michigan. Send your questions or comments for Mike via the IT Jungle Contact page.

    RELATED STORIES

    Protect Your Intellectual Property: Obfuscate DB2 For i Source Code

    Retrieving and Storing SQL Source for DB2 Database Objects

    Build SQL to Define Your Existing Files

    DB2 For i XMLTABLE, Part 1: Convert XML to Tabular Data

    Staggering SQL String Handling with Regular Expressions

    Staggering SQL String Handling with Regular Expressions



                         Post this story to del.icio.us
                   Post this story to Digg
        Post this story to Slashdot

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    Tags:

    Sponsored by
    VISUAL LANSA 16 WEBINAR

    Trying to balance stability and agility in your IBM i environment?

    Join this webinar and explore Visual LANSA 16 – our enhanced professional low-code platform designed to help organizations running on IBM i evolve seamlessly for what’s next.

    🎙️VISUAL LANSA 16 WEBINAR

    Break Monolithic IBM i Applications and Unlock New Value

    Explore modernization without rewriting. Decouple monolithic applications and extend their value through integration with modern services, web frameworks, and cloud technologies.

    🗓️ July 10, 2025

    ⏰ 9 AM – 10 AM CDT (4 PM to 5 PM CEST)

    See the webinar schedule in your time zone

    Register to join the webinar now

    What to Expect

    • Get to know Visual LANSA 16, its core features, latest enhancements, and use cases
    • Understand how you can transition to a MACH-aligned architecture to enable faster innovation
    • Discover native REST APIs, WebView2 support, cloud-ready Azure licensing, and more to help transform and scale your IBM i applications

    Read more about V16 here.

    Share this:

    • Reddit
    • Facebook
    • LinkedIn
    • Twitter
    • Email

    Sponsored Links

    United Computer Group, Inc.:  Vault400 for secure online backup and disaster recovery solutions.
    Bytware:  Your IFS Files Aren't Safe. Download the free IFS Security Bundle.
    ProData Computer Services:  Let 'em run WILD . . . with SQL! Download today!

    More IT Jungle Resources:

    System i PTF Guide: Weekly PTF Updates
    IBM i Events Calendar: National Conferences, Local Events, and Webinars
    Breaking News: News Hot Off The Press
    TPM @ The Reg: More News From ITJ EIC Timothy Prickett Morgan

    The Sweet 16 Of Mobile App Dev Tools for IBM i Making Hadoop Elephants Drink From Silverlake

    Leave a Reply Cancel reply

Volume 13, Number 10 -- May 15, 2013
THIS ISSUE SPONSORED BY:

WorksRight Software
ProData Computer Services
American Top Tools

Table of Contents

  • Search SQL Source Using System Catalogs
  • Bind By Slash-Copy
  • Adding A Job Queue To A Batch Subsystem

Content archive

  • The Four Hundred
  • Four Hundred Stuff
  • Four Hundred Guru

Recent Posts

  • With Power11, Power Systems “Go To Eleven”
  • With Subscription Price, IBM i P20 And P30 Tiers Get Bigger Bundles
  • Izzi Buys CNX, Eyes Valence Port To System Z
  • IBM i Shops “Attacking” Security Concerns, Study Shows
  • IBM i PTF Guide, Volume 27, Number 26
  • Liam Allan Shares What’s Coming Next With Code For IBM i
  • From Stable To Scalable: Visual LANSA 16 Powers IBM i Growth – Launching July 8
  • VS Code Will Be The Heart Of The Modern IBM i Platform
  • The AS/400: A 37-Year-Old Dog That Loves To Learn New Tricks
  • IBM i PTF Guide, Volume 27, Number 25

Subscribe

To get news from IT Jungle sent to your inbox every week, subscribe to our newsletter.

Pages

  • About Us
  • Contact
  • Contributors
  • Four Hundred Monitor
  • IBM i PTF Guide
  • Media Kit
  • Subscribe

Search

Copyright © 2025 IT Jungle