Aller au contenu

Service SQL IBM i (AS/400) · Fonction table

QSYS2.PARSE_STATEMENT

Analyser une instruction SQL

Analyse le texte d'une instruction SQL et renvoie les tables, colonnes et autres objets qu'elle référence.

À quoi ça sert

Cette fonction de table décompose une instruction SQL (SQL_STATEMENT) et renvoie les noms qu'elle contient : type de nom (NAME_TYPE, par exemple TABLE), nom, schéma, base relationnelle, colonne, type d'utilisation, position dans le texte et type d'instruction. Les paramètres NAMING ('*SYS' par défaut), DECIMAL_POINT et SQL_STRING_DELIMITER indiquent les conventions du texte analysé.

Elle sert à l'analyse d'impact : dans l'exemple d'IBM, on parcourt les instructions SQL statiques des programmes d'une bibliothèque pour trouver toutes les tables qu'elles référencent. C'est utile avant de renommer ou de supprimer une table.

Résultat réel sur un IBM i 7.5

Ce que nous avons exécuté :

SELECT c.schema, c.name FROM TABLE(QSYS2.PARSE_STATEMENT('SELECT * FROM JOBISQL.CLIENT C JOIN JOBISQL.CLIENT2 D ON C.ID=D.ID')) c WHERE c.name_type = 'TABLE' ORDER BY c.schema, c.name

Ce que l'IBM i a renvoyé le 01/10/2026 (2 lignes au plus) :

SCHEMA Schéma NAME Nom
JOBISQL CLIENT
JOBISQL CLIENT2

Données anonymisées : les noms de système, de profils, de bibliothèques, de postes et les adresses IP ont été remplacés. Les objets du schéma JOBISQL sont des objets de démonstration créés pour ce site.

L'exemple d'IBM

Pour le schéma TOYSTORE, trouver toutes les tables référencées par les instructions SQL statiques de tous les programmes d'application.

-- Description: For schema TOYSTORE, find all tables referenced by 
-- static SQL statements by all application programs 
  WITH program_statements(naming_mode,
                          dec_point,
                          string_delim,
                          stmt_text,
                          system_program_name,
                          program_type)
    AS (SELECT a.naming,
               a.decimal_point,
               a.sql_string_delimiter,
               b.statement_text,
               a.system_program_name,
               a.program_type
          FROM qsys2.sysprogramstat a INNER JOIN
               qsys2.sysprogramstmtstat b ON 
                     a.program_schema = b.program_schema AND
                     a.program_name = b.program_name AND
                     a.module_name = b.module_name
          WHERE a.program_schema = 'TOYSTORE' AND
                b.program_schema = 'TOYSTORE')
    SELECT system_program_name,
           program_type,
           c.schema,
           c.name,
           stmt_text
      FROM program_statements,
         TABLE(qsys2.parse_statement(stmt_text, naming_mode,
                                     dec_point, string_delim)) c
      WHERE c.name_type = 'TABLE'
      ORDER BY c.schema, c.name;

Paramètres

ParamètreTypePar défautSignification
SQL_STATEMENT DOUBLE-BYTE CHAR LARGE OBJECT obligatoire Instruction SQL à analyser
NAMING VARCHAR(4) '*SYS' Convention de nommage
DECIMAL_POINT VARCHAR(7) '*PERIOD' Caractère du séparateur décimal
SQL_STRING_DELIMITER VARCHAR(9) '*APOSTSQL' Délimiteur de chaînes SQL

Colonnes renvoyées (9)

Afficher les 9 colonnes
ColonneTypeSignification
NAME_TYPE VARCHAR(30) Type de nom
NAME VARCHAR(128) Nom
SCHEMA VARCHAR(128) Schéma
RDB VARCHAR(128) Base de données relationnelle (RDB)
COLUMN_NAME VARCHAR(128) Nom de la colonne
ADDITIONAL_NAME VARCHAR(128) Nom supplémentaire
USAGE_TYPE VARCHAR(17) Type d'utilisation
NAME_START_POSITION INTEGER Position de début du nom
SQL_STATEMENT_TYPE VARCHAR(32) Type de l'instruction SQL