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ètre | Type | Par défaut | Signification |
|---|---|---|---|
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 |