Académique Documents
Professionnel Documents
Culture Documents
1. Soit la table PRODUIT(id, nom, description, categorie, prix). Pour charger en mémoire le résultat de la
requête SELECT * FROM PRODUIT WHERE categorie = ‘Téléphone’, quel mécanisme faut-il utiliser :
SELECT INTO variable ou bien curseur ? Justifier.
Soit la base de données « Los Surfers Muertos » dont le schéma relationnel est donné ci-dessous.
1. Créer un type composite (enregistrement) de nom tResultat, constitué de deux champs : libelle (chaîne de
caractères) et valeur (nombre).
2. Écrire une fonction de nom gainsHF() qui renvoie la moyenne des gains des surfeurs (H) et des surfeuses
(F), respectivement.
3. Écrire une fonction de nom listeCompet() qui renvoie le nom du spot, l’année et le nombre de points
d’un∙e surfeur∙se dont le surnom est passé en paramètre à la fonction.
4. Soit la table TABLEAU (Année, NumSurfeur#, Surnom, totalPoints) qui récapitule le nombre de points
accumulés chaque année par chaque surfeur, avec un tri croissant sur l’année et décroissant sur la somme
des points. Écrire un déclencheur de nom trigTableau qui, pour toute mise à jour de la table COMPET,
recalcule intégralement le contenu de la table TABLEAU. De plus, si l’une des valeurs de Points dans la
table COMPET n’est pas renseignée, lever une exception qui interrompt le traitement.
XQuery (7 points)
Soient les trois documents XML articles.xml (articles de presse), images.xml (photos) et inventaire.xml (liste
de bâtiments) liés au patrimoine industriel de la région lilloise (projet de recherche TECTONIQ 1). La structure
de ces documents XML est donnée ci-contre.
+ Cardinalité 1 à plusieurs
* Cardinalité 0 à plusieurs
? Cardinalité 0 ou 1
1 http://tectoniq.meshs.fr/
Formuler à l’aide du langage XQuery les requêtes suivantes (utiliser, de la syntaxe XPath ou FLWOR, la
plus appropriée).
3. Code des photos prises avant l’an 2000 et dont la description contient le mot-clé « Usine ».
4. Information concernant les images au format suivant : <image code="C" statut="S" /> ; où C est
le code-img de la photo et S est égal à « ancienne » si la photo a été prise avant l’an 2000, « récente »
sinon.
5. Pour chaque image, donner son titre (dans un élément image) et le titre de l’article dans lequel elle
apparaît (dans un élément article).
2. Un curseur paramétré est toujours explicite. L’ouverture du curseur permet notamment la transmission
des paramètres.
3. Les données semi-structurées ne nécessitent pas obligatoirement de schéma car elles sont
autodescriptives.
Correction PL/pgSQL
-- 1
create type tResultat as (
libelle varchar,
valeur numeric
);
-- 2
create or replace function gainsHF() returns setof tResultat as $$
declare
res tResultat;
begin
res.libelle := 'Surfeurs';
select avg(gain) into res.valeur from COMPET c, SURFEUR s
where c.Surfeur = s.NumSurfeur and sexe = 'H';
return next res;
res.libelle := 'Surfeuses';
select avg(gain) into res.valeur from COMPET c, SURFEUR s
where c.Surfeur = s.NumSurfeur and sexe = 'F';
return next res;
return;
end
$$ language plpgsql;
-- 3
create type tCompet as (
spot varchar,
annee numeric,
points numeric
);
-- Remplissage du tableau
for t in select Annee, NumSurfeur, Surnom, sum(Points) as totalPoints
from COMPET c, SURFEUR s where c.Surfeur = s.NumSurfeur
group by Annee, NumSurfeur, Surnom order by Annee, totalPoints
DESC
loop
insert into TABLEAU VALUES(t.Annee, t.NumSurfeur, t.Surnom,
t.totalPoints);
end loop;
return NEW;
end
$$ language plpgsql;
Correction XQuery
(: 1 :)
distinct-values(//adresse)
(: 2 :)
//document[//sous-titre]
(: 3 :)
/liste/enregistrement[year-from-date(description/date) < 2000
and description/mot-cle = "Usine"]/code-
img
(: 4 :)
for $i in /liste/enregistrement
return if (year-from-date($i/description/date) < 2000)
then <image code="{data($i/code-img)}" statut="ancienne" />
else <image code="{data($i/code-img)}" statut="récente" />
(: 5 :)
for $i in /liste/enregistrement, for $i in /liste/enregistrement,
$a in //document $a in //document[$i/code-img =
where $a//ref-img = $i/code-img references/ref-img]
return return
<resultat> <resultat>
<image>{data($i//titre)}</image> <image>{data($i//titre)}</image>
<article>{data($a//titre)}</article> <article>{data($a//titre)}</article>
</resultat> </resultat>
(: 7 :)
for $a in //document
group by $t := $a//titre
return <article titre="{$t}"
nbreferences="{count($a//ref-img) + count($a//ref-bat)}" />