Retrouver les instructions SQL contenues dans les programmes

Toutes les instructions SQL contenues dans un programme – mais pas les CL – sont écrites dans qsys2.sysprogramstmtstat; qu’on ait le source du programme ou pas.
En plus de stocker l’instruction, on accède à d’autres informations comme le nombre d’exécutions, le nombre de variables hôtes …
DSPPGMREF référence l’utilisation de fichier par SQL de façon très succincte, on accède à bien plus de détails
en explorant QSYS2.SYSPROGRAMSTMTSTAT.

On peut visualiser directement les différentes instructions :

Si on n’est intéressé que par les tables écrites dans les instructions contenues dans un programme, il faut filtrer. On utilise la fonction table qsys2.parse_statement qui sait parser le SQL. Cette dernière, pour faire le travail, a besoin d’informations supplémentaires contenues dans
qsys2.sysprogrammstat :

  • convention de nommage
  • séparateur décimal
  • délimitateur de chaine

Cela donne la requête :

WITH program_statements(naming_mode, dec_point, string_delim, stmt_text, stmt_nbr, system_program_name, program_type) AS
(SELECT a.naming,
a.decimal_point,
a.sql_string_delimiter,
b.statement_text,
b.statement_number,
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.number_statements > 0
AND a.program_schema = ‘GCOMPARE’
AND a.program_name =’COMPARE1′ )
SELECT system_program_name,
program_type,
c.schema,
c.name,
stmt_nbr,
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 stmt_nbr,
c.schema,
c.name;

On peut modifier cette dernière requête en indiquant une liste de bibliothèques pour a.program_schema.
En la planifiant régulièrement et en récupérant son resultset dans un fichier, on pourra voir rapidement les utilisations connues d’une table.

Malheureusement (ou pas) les « Execute Immediate :var » n’indiquent pas ce qu’elles contiennent …