Service SQL IBM i (AS/400) · Procédure
QSYS2.GENERATE_SQL_OBJECTS
Générer le DDL SQL dans l'ordre de dépendance
Génère le DDL SQL d'une liste d'objets de base de données fournie dans une table, en respectant l'ordre de création imposé par leurs dépendances.
À quoi ça sert
Contrairement à QSYS2.GENERATE_SQL, qui traite des objets désignés par un nom et un type, cette procédure reçoit en entrée une table qui contient la liste des objets à traiter (schéma, nom et type SQL : TABLE, VIEW, INDEX, ALIAS). Le nom de cette table se donne dans SYSTEM_TABLE_NAME et sa bibliothèque dans SYSTEM_TABLE_SCHEMA (par défaut QTEMP).
Le DDL produit est classé dans un ordre qui permet de rejouer le script : une vue arrive après les tables dont elle dépend. C'est l'intérêt principal pour recréer une application complète ailleurs. Le résultat va dans un membre de fichier source (Q_GENSQOBJ de QTEMP par défaut) ou dans un fichier de flux.
Les options de génération sont les mêmes que pour GENERATE_SQL : remplacement, suppression préalable, contraintes, déclencheurs, privilèges, commentaires, libellés, qualification des noms, formats de date et d'heure, etc. L'exemple d'IBM construit la liste des objets d'une bibliothèque à partir du catalogue, puis appelle la procédure avec QUALIFIED_NAME_OPTION => '1'.
Résultat réel sur un IBM i 7.5
Procédure non exécutée sur notre IBM i de test : elle agit sur la configuration du système ou sur d'autres travaux.
L'exemple d'IBM
Générer des instructions DDL ordonnées pour tous les objets fichier de la bibliothèque MYLIB.
-- Description: Generate ordered DDL statements for all file objects in MYLIB
-- First create the table to contain the list of objects.
CREATE TABLE QTEMP.INORDER (OBJECT_SCHEMA VARCHAR(258), OBJECT_NAME VARCHAR(258), SQL_OBJECT_TYPE CHAR(10));
-- Now populate the table with objects from a schema. Omit system objects.
INSERT INTO qtemp.inorder(object_schema, object_name, sql_object_type) SELECT 'MYLIB', dbxfil, CASE WHEN dbxatr = 'AL' THEN 'ALIAS' WHEN dbxatr = 'IX' THEN 'INDEX' WHEN dbxatr IN ('TB', 'MQ', 'PF') THEN 'TABLE' WHEN dbxatr IN ('VW', 'LF') THEN 'VIEW' ELSE dbxatr END FROM qsys.qadbxfil f WHERE dbxlb2 = 'MYLIB' AND dbxatr IN ('AL','IX','TB','MQ','PF','VW','LF') AND dbxrel = 'Y' AND dbxlfi NOT LIKE 'QIDCT%' AND dbxlfi NOT IN ('SYSCHKCST', 'SYSCOLUMNS', 'SYSCST', 'SYSCSTCOL', 'SYSCSTDEP', 'SYSFIELDS', 'SYSINDEXES', 'SYSKEYCST', 'SYSKEYS', 'SYSPACKAGE', 'SYSREFCST', 'SYSTABLEDEP', 'SYSTABLES', 'SYSTRIGCOL', 'SYSTRIGDEP', 'SYSTRIGGERS', 'SYSTRIGUPD', 'SYSVIEWDEP', 'SYSVIEWS');
-- Generate the ordered DDL
CALL QSYS2.GENERATE_SQL_OBJECTS(SYSTEM_TABLE_NAME=>'INORDER', SYSTEM_TABLE_SCHEMA=>'QTEMP', QUALIFIED_NAME_OPTION=>'1');
Bon à savoir
Dans l'exemple d'IBM, les fichiers système du catalogue (SYSTABLES, SYSCOLUMNS…) sont exclus de la liste. Fais de même, sinon tu génères aussi des définitions de vues du catalogue.
Paramètres
| Paramètre | Type | Par défaut | Signification |
|---|---|---|---|
SYSTEM_TABLE_NAME |
VARCHAR(10) | obligatoire | Nom système de la table |
SYSTEM_TABLE_SCHEMA |
VARCHAR(10) | 'QTEMP' | Bibliothèque système de la table |
DATABASE_SOURCE_FILE_NAME |
VARCHAR(10) | 'Q_GENSQOBJ' | 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_GENSQOBJ' | 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 |