Aller au contenu

Service SQL IBM i (AS/400) · Procédure

QSYS2.GENERATE_SQL

Générer le DDL SQL d'objets

Génère les instructions SQL (DDL) qui recréent des tables, vues, index ou autres objets d'une bibliothèque, dans un membre source ou un fichier IFS.

À quoi ça sert

La procédure lit la définition d'objets de base de données et produit le source SQL correspondant : CREATE TABLE, vues, index, alias, contraintes, déclencheurs, etc. Les trois premiers paramètres désignent la cible : DATABASE_OBJECT_NAME (le nom accepte le joker %), DATABASE_OBJECT_LIBRARY_NAME et DATABASE_OBJECT_TYPE. Le résultat est écrit dans un membre de fichier source (DATABASE_SOURCE_FILE_NAME, DATABASE_SOURCE_FILE_LIBRARY_NAME, DATABASE_SOURCE_FILE_MEMBER) ou, avec SOURCE_STREAM_FILE, dans un fichier de flux de l'IFS.

De nombreuses options règlent le contenu produit, chacune avec une valeur par défaut : REPLACE_OPTION, DROP_OPTION, CREATE_OR_REPLACE_OPTION, CONSTRAINT_OPTION, TRIGGER_OPTION, PRIVILEGES_OPTION, COMMENT_OPTION, LABEL_OPTION, QUALIFIED_NAME_OPTION, SYSTEM_NAME_OPTION, ainsi que les formats de date et d'heure et la convention de nommage. On les passe de préférence par nom (OPTION => valeur).

Les usages courants sont la documentation d'une base, la création d'un environnement de test identique, la migration d'un système à un autre et la sauvegarde de la structure sous gestionnaire de sources. Par défaut le membre cible est QTEMP/Q_GENSQL : il disparaît avec le travail, d'où l'intérêt de préciser une bibliothèque réelle. Dans l'exemple d'IBM, le fichier source est créé avant l'appel, puis relu par un alias.

Résultat réel sur un IBM i 7.5

Ce que nous avons exécuté :

CALL QSYS2.GENERATE_SQL(DATABASE_OBJECT_NAME => 'CLIENT', DATABASE_OBJECT_LIBRARY_NAME => 'JOBISQL', DATABASE_OBJECT_TYPE => 'TABLE', CREATE_OR_REPLACE_OPTION => '1', PRIVILEGES_OPTION => '0', HEADER_OPTION => '0');
SELECT SRCSEQ, SRCDTA FROM QTEMP.Q_GENSQL ORDER BY SRCSEQ

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

SRCSEQ SRCDTA
1 CREATE OR REPLACE TABLE JOBISQL.CLIENT (
2 "ID" INTEGER GENERATED ALWAYS AS IDENTITY (
3 START WITH 1 INCREMENT BY 1
4 NO MINVALUE NO MAXVALUE
5 NO CYCLE NO ORDER

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

Générer le DDL de toutes les tables de la bibliothèque TOYSTORE.

-- Description: Generate DDL for all tables within the TOYSTORE library 
 call qsys2.qcmdexc('QSYS/CRTLIB DDLSOURCE'); 
 call qsys2.qcmdexc('QSYS/CRTSRCPF FILE(DDLSOURCE/GEN' CONCAT 
        overlay(overlay(current date,'',3,1),'',5,1) CONCAT ') RCDLEN(92)'); 
 call qsys2.qcmdexc('QSYS/ADDPFM FILE(DDLSOURCE/GEN' CONCAT 
        overlay(overlay(current date,'',3,1),'',5,1) CONCAT ') MBR(DDLSOURCE)'); 
 call qsys2.generate_sql ('%', 'TOYSTORE', 'TABLE', 'GEN' CONCAT 
        overlay(overlay(current date,'',3,1),'',5, 1), 'DDLSOURCE', 
        'DDLSOURCE', REPLACE_OPTION => '0', CONSTRAINT_OPTION => '2'); 
 begin 
   execute immediate 'create alias qtemp.ddl_1 for DDLSOURCE/GEN' CONCAT 
     overlay(overlay(current date,'',3,1),'',5,1) CONCAT '(DDLSOURCE)'; 
 END; 
 Select * from qtemp.ddl_1;

Bon à savoir

Le fichier source et le membre cible doivent exister avant l'appel, comme le montre l'exemple d'IBM. Avec la valeur par défaut, le résultat va dans QTEMP et se perd à la fin du travail.

Paramètres

ParamètreTypePar défautSignification
DATABASE_OBJECT_NAME VARCHAR(258) obligatoire Nom de l'objet de base de données
DATABASE_OBJECT_LIBRARY_NAME VARCHAR(258) obligatoire Nom de la bibliothèque de l'objet de base de données
DATABASE_OBJECT_TYPE VARCHAR(10) obligatoire Type de l'objet de base de données à traiter
DATABASE_SOURCE_FILE_NAME VARCHAR(10) 'Q_GENSQL' Nom du fichier source de base de données
DATABASE_SOURCE_FILE_LIBRARY_NAME VARCHAR(10) 'QTEMP' Bibliothèque du fichier source de base de données
DATABASE_SOURCE_FILE_MEMBER VARCHAR(10) 'Q_GENSQL' Membre du fichier source de base de données
SEVERITY_LEVEL INTEGER 39 Niveau de gravité
REPLACE_OPTION CHAR(1) '1' Option de remplacement
STATEMENT_FORMATTING_OPTION CHAR(1) '1' Option de mise en forme des instructions
DATE_FORMAT CHAR(3) 'ISO' Format de date
DATE_SEPARATOR CHAR(1) '-' Séparateur de date
TIME_FORMAT CHAR(3) 'ISO' Format d'heure
TIME_SEPARATOR CHAR(1) '.' Séparateur d'heure
NAMING_OPTION CHAR(3) 'SQL' Option de convention de nommage
DECIMAL_POINT CHAR(1) '.' Caractère du séparateur décimal
STANDARDS_OPTION CHAR(1) '0' Option de conformité aux normes SQL
DROP_OPTION CHAR(1) '0' Option de suppression (DROP)
MESSAGE_LEVEL INTEGER 0 Niveau des messages
COMMENT_OPTION CHAR(1) '1' Option de commentaires
LABEL_OPTION CHAR(1) '1' Option de génération des libellés
HEADER_OPTION CHAR(1) '1' Option d'en-tête
TRIGGER_OPTION CHAR(1) '1' Option de génération des déclencheurs
CONSTRAINT_OPTION CHAR(1) '1' Option de contraintes
SYSTEM_NAME_OPTION CHAR(1) '1' Option de nom système
PRIVILEGES_OPTION CHAR(1) '1' Option de génération des privilèges
CCSID_OPTION CHAR(1) '1' Option de CCSID
CREATE_OR_REPLACE_OPTION CHAR(1) '0' Option CREATE OR REPLACE
OBFUSCATE_OPTION CHAR(1) '0' Option d'obfuscation du code généré
ACTIVATE_ROW_AND_COLUMN_ACCESS_CONTROL_OPTION CHAR(1) '1' Option d'activation du contrôle d'accès aux lignes et colonnes
MASK_AND_PERMISSION_OPTION CHAR(1) '1' Option de génération des masques et permissions
QUALIFIED_NAME_OPTION CHAR(1) '0' Option de qualification des noms
ADDITIONAL_INDEX_OPTION CHAR(1) '0' Option d'index supplémentaire
INDEX_INSTEAD_OF_VIEW_OPTION CHAR(1) '0' Option index à la place de la vue
TEMPORAL_OPTION CHAR(1) '0' Option des tables temporelles
SOURCE_STREAM_FILE DOUBLE-BYTE CHAR LARGE OBJECT '' Fichier de flux source
SOURCE_STREAM_FILE_END_OF_LINE VARCHAR(4) 'CRLF' Fin de ligne du fichier de flux source
SOURCE_STREAM_FILE_CCSID INTEGER 0 CCSID du fichier de flux source