186
Chapitre 7 • Applications avancées en SQL
Remarques
1. Rappelons que le procédé ne fonctionne que pour des colonnes déclarées not
null. L’extension aux colonnes facultatives est suggérée dans l’exercice
7.31.
2. Le résultat ne sera en général guère satisfaisant car les valeurs apparaîtront
dans un ordre aléatoire par rapport à celui des colonnes, ce qui risque, au
mieux de provoquer des erreurs détectées par le SGBD, et au pire, de corrompre les données. On se référera à l’exercice 7.32 qui aborde cette question.
3. Les instructions "insert into" produites par les requêtes générées sont syntaxiquement incorrectes car chaque valeur, y compris la dernière, est suivie
d’une virgule. L’exercice 7.33 propose de remédier à ce problème.
4. Si le SGBD l’autorise, il est possible de regrouper ces instructions en une seule
requête, sans faire usage de la table LIGNE. Si on dénote par Q1, Q2, Q3 les
requêtes SFW des trois instructions "insert into LIGNE", dans lesquelles
les résultats ont reçu les alias SEQ et LTEXTE, on peut écrire :
select LTEXTE
from Q1 union Q2 union Q3
order by SEQ
7.4.3 Génération de définitions de bases de données
Nous savons que les tables du catalogue sont garnies lors de l’exécution des instructions de création de structures de données (create table, alter table, etc). A
l’inverse, il devrait être possible de reconstituer ces instructions de création à partir
du contenu des tables du catalogue. C’est ce que nous allons montrer à partir des
tables décrites à la figure 3.5, que nous utiliserons pour produire la définition des
tables et des colonnes. Le traitement des identifiants et des clés étrangères est laissé
à l’initiative du lecteur à titre d’exercice. Pour produire les requêtes create table,
nous devons travailler en plusieurs étapes. En effet, si on les dispose comme cidessous, on observe que ces requête comportent trois types de composants distincts,
certains étant uniques, "create table DETAIL(" et ");", et les autres multiples :
les définitions des colonnes.
create table DETAIL (
NCOM char(12) not null,
NPRO char(15) not null,
QCOM decimal(8) not null
);
A chacun de ces composants va correspondre une requête SFW qui va ranger son
résultat dans une table intermédiaire LIGNE. Les lignes de LIGNE devant sortir dans
un ordre déterminé pour former des instructions de création de table correctes, nous
leur associerons deux codes : NOMT qui donne le nom de la table et SEQ qui indique
la position de la ligne dans l’instruction create table. Le fragment d’instruction luimême sera rangé dans la colonne LTEXTE.
Chapitre 7 • Applications avancées en SQL
Remarques
1. Rappelons que le procédé ne fonctionne que pour des colonnes déclarées not
null. L’extension aux colonnes facultatives est suggérée dans l’exercice
7.31.
2. Le résultat ne sera en général guère satisfaisant car les valeurs apparaîtront
dans un ordre aléatoire par rapport à celui des colonnes, ce qui risque, au
mieux de provoquer des erreurs détectées par le SGBD, et au pire, de corrompre les données. On se référera à l’exercice 7.32 qui aborde cette question.
3. Les instructions "insert into" produites par les requêtes générées sont syntaxiquement incorrectes car chaque valeur, y compris la dernière, est suivie
d’une virgule. L’exercice 7.33 propose de remédier à ce problème.
4. Si le SGBD l’autorise, il est possible de regrouper ces instructions en une seule
requête, sans faire usage de la table LIGNE. Si on dénote par Q1, Q2, Q3 les
requêtes SFW des trois instructions "insert into LIGNE", dans lesquelles
les résultats ont reçu les alias SEQ et LTEXTE, on peut écrire :
select LTEXTE
from Q1 union Q2 union Q3
order by SEQ
7.4.3 Génération de définitions de bases de données
Nous savons que les tables du catalogue sont garnies lors de l’exécution des instructions de création de structures de données (create table, alter table, etc). A
l’inverse, il devrait être possible de reconstituer ces instructions de création à partir
du contenu des tables du catalogue. C’est ce que nous allons montrer à partir des
tables décrites à la figure 3.5, que nous utiliserons pour produire la définition des
tables et des colonnes. Le traitement des identifiants et des clés étrangères est laissé
à l’initiative du lecteur à titre d’exercice. Pour produire les requêtes create table,
nous devons travailler en plusieurs étapes. En effet, si on les dispose comme cidessous, on observe que ces requête comportent trois types de composants distincts,
certains étant uniques, "create table DETAIL(" et ");", et les autres multiples :
les définitions des colonnes.
create table DETAIL (
NCOM char(12) not null,
NPRO char(15) not null,
QCOM decimal(8) not null
);
A chacun de ces composants va correspondre une requête SFW qui va ranger son
résultat dans une table intermédiaire LIGNE. Les lignes de LIGNE devant sortir dans
un ordre déterminé pour former des instructions de création de table correctes, nous
leur associerons deux codes : NOMT qui donne le nom de la table et SEQ qui indique
la position de la ligne dans l’instruction create table. Le fragment d’instruction luimême sera rangé dans la colonne LTEXTE.
