parent
25ec73f531
commit
101e289321
@ -0,0 +1,251 @@
|
||||
-- 2. Ecrire un bloc PL/pgSQL anonyme qui affiche
|
||||
|
||||
DO $$
|
||||
DECLARE
|
||||
a numeric := 0;
|
||||
b numeric := 1;
|
||||
c numeric;
|
||||
i integer := 0;
|
||||
BEGIN
|
||||
WHILE i<10 LOOP
|
||||
c=a+b;
|
||||
RAISE NOTICE 'a=% b=% c=%', a, b, c;
|
||||
a=b;
|
||||
b=c;
|
||||
i=i+1;
|
||||
END LOOP;
|
||||
END;
|
||||
$$;
|
||||
|
||||
-- 3. Faire la meme mais en fonction pgSQL
|
||||
|
||||
CREATE OR REPLACE FUNCTION fibonacci(n integer) RETURNS SETOF integer AS $$
|
||||
DECLARE
|
||||
a numeric := 0;
|
||||
b numeric := 1;
|
||||
c numeric;
|
||||
i integer := 0;
|
||||
BEGIN
|
||||
WHILE i<(n-1) LOOP
|
||||
c=a+b;
|
||||
-- RAISE NOTICE 'a=% b=% c=%', a, b, c;
|
||||
a=b;
|
||||
b=c;
|
||||
i=i+1;
|
||||
RETURN NEXT c;
|
||||
END LOOP;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- 4. Appel de la fonction avec comme parametre 0, 1, 2, 10
|
||||
|
||||
SELECT fibonacci(0);
|
||||
SELECT * FROM fibonacci(1);
|
||||
SELECT * FROM fibonacci(2);
|
||||
SELECT * FROM fibonacci(10);
|
||||
|
||||
-- fibonacci
|
||||
-- -----------
|
||||
-- (0 ligne)
|
||||
|
||||
-- fibonacci
|
||||
-- -----------
|
||||
-- (0 ligne)
|
||||
|
||||
-- fibonacci
|
||||
-- -----------
|
||||
-- 1
|
||||
-- (1 ligne)
|
||||
|
||||
-- fibonacci
|
||||
-- -----------
|
||||
-- 1
|
||||
-- 2
|
||||
-- 3
|
||||
-- 5
|
||||
-- 8
|
||||
-- 13
|
||||
-- 21
|
||||
-- 34
|
||||
-- 55
|
||||
-- (9 lignes)
|
||||
|
||||
|
||||
|
||||
-- 5. Ecrire une fonction en plpgsql nb_athletes qui retourn le nombre d'athlètes d'un pays dont le code est passé en paramètre
|
||||
|
||||
CREATE OR REPLACE FUNCTION nb_athletes(pays_code character varying) RETURNS integer AS $$
|
||||
DECLARE
|
||||
nb_athletes integer;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO nb_athletes FROM athlete WHERE pays = pays_code;
|
||||
RETURN nb_athletes;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- 6. Utiliser la fonction précédente pour calculer le nombre d'athlèthes français
|
||||
|
||||
SELECT nb_athletes('FRA');
|
||||
|
||||
-- nb_athletes
|
||||
-- -------------
|
||||
-- 396
|
||||
-- (1 ligne)
|
||||
|
||||
|
||||
-- 7. Ecrire une requete sql utilisant la fonction nb_athletes pour afficher le code et le nom de tous les pays ayant plus d'athlètes que la France
|
||||
|
||||
SELECT pays, nom FROM pays WHERE nb_athletes(pays.code) > nb_athletes('FRA');
|
||||
|
||||
-- pays | nom
|
||||
-- ------------------------------------+----------------------------
|
||||
-- (AUS,Australia) | Australia
|
||||
-- (USA,"United States of America") | United States of America
|
||||
-- (GER,Germany) | Germany
|
||||
-- (JPN,Japan) | Japan
|
||||
-- (CHN,"People's Republic of China") | People's Republic of China
|
||||
-- (5 lignes)
|
||||
|
||||
-- 8. Ecrire une fonction en pgpsql epr qui prend deux paramètres (le nom d'une discipline et une date) et qui retourne les epreuves (code et nom) de cette discipline ayant lieu à la date donnée
|
||||
|
||||
CREATE OR REPLACE FUNCTION epr(discipline varchar, date date) RETURNS SETOF epreuve AS $$
|
||||
DECLARE
|
||||
epreuve epreuve;
|
||||
BEGIN
|
||||
FOR epreuve IN SELECT *
|
||||
FROM epreuve e, discipline d
|
||||
WHERE e.discipl = d.code AND e.dateE = date LOOP
|
||||
RETURN NEXT epreuve;
|
||||
END LOOP;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- %TYPE pour recuperer le type de la colonne
|
||||
|
||||
-- 9. Utiliser la fonction epr pour afficher les noms des epreuves d'athlètisme ('Athletics') ayant lieu le 3 août 2021
|
||||
|
||||
SELECT epr('Athletics', '2021-08-03');
|
||||
|
||||
-- epr
|
||||
-- ----------------------------------------------------------------------
|
||||
-- (E206,GAR,"Men's Horizontal Bar",2021-08-03)
|
||||
-- (E207,GAR,"Men's Parallel Bars",2021-08-03)
|
||||
-- (E208,GAR,"Women's Balance Beam",2021-08-03)
|
||||
-- (E209,ATH,"Men's 400m Hurdles",2021-08-03)
|
||||
-- (E210,ATH,"Men's Pole Vault",2021-08-03)
|
||||
-- (E211,ATH,"Women's 200m",2021-08-03)
|
||||
-- (E212,ATH,"Women's 800m",2021-08-03)
|
||||
-- (E213,ATH,"Women's Hammer Throw",2021-08-03)
|
||||
-- (E214,ATH,"Women's Long Jump",2021-08-03)
|
||||
-- (E215,BOX,"Men's Feather (52-57kg)",2021-08-03)
|
||||
-- (E216,BOX,"Men's Heavy (81-91kg)",2021-08-03)
|
||||
-- (E217,BOX,"Men's Welter (63-69kg)",2021-08-03)
|
||||
-- (E218,BOX,"Women's Feather (54-57kg)",2021-08-03)
|
||||
-- (E219,CSP,"Men's Canoe Double 1000m",2021-08-03)
|
||||
-- (E220,CSP,"Men's Kayak Single 1000m",2021-08-03)
|
||||
-- (E221,CSP,"Women's Kayak Double 500m",2021-08-03)
|
||||
-- (E222,CSP,"Women's Kayak Single 200m",2021-08-03)
|
||||
-- (E223,CTR,"Men's Team Sprint",2021-08-03)
|
||||
-- (E224,CTR,"Women's Team Pursuit",2021-08-03)
|
||||
-- (E225,DIV,"Men's 3m Springboard",2021-08-03)
|
||||
-- (E226,SAL,"Men's One Person Dinghy (Heavyweight) - Finn",2021-08-03)
|
||||
-- (E227,SAL,"Men's Skiff - 49er",2021-08-03)
|
||||
-- (E228,SAL,"Mixed Multihull - Nacra 17 Foiling",2021-08-03)
|
||||
-- (E229,SAL,"Women's Skiff - 49er FX",2021-08-03)
|
||||
-- (E230,WLF,"Men's 109kg",2021-08-03)
|
||||
-- (E231,WRE,"Men's Greco-Roman 77kg",2021-08-03)
|
||||
-- (E232,WRE,"Men's Greco-Roman 97kg",2021-08-03)
|
||||
-- (E233,WRE,"Women's Freestyle 68kg",2021-08-03)
|
||||
-- (28 lignes)
|
||||
|
||||
-- 10. Le mauvais temps empêche la tenue de compétition en exterieur. Utiliser la fonction epr pour décaler d'un jour toutes les epreuves d'équitation ('Equestrian') ayant lieu le 2 août 2021
|
||||
|
||||
SELECT epr('Equestrian', '2021-08-02');
|
||||
|
||||
-- epr
|
||||
-- ---------------------------------------------------
|
||||
-- (E186,GAR,"Men's Rings",2021-08-02)
|
||||
-- (E187,GAR,"Men's Vault",2021-08-02)
|
||||
-- (E188,GAR,"Women's Floor Exercise",2021-08-02)
|
||||
-- (E189,ATH,"Men's 3000m Steeplechase",2021-08-02)
|
||||
-- (E190,ATH,"Men's Long Jump",2021-08-02)
|
||||
-- (E191,ATH,"Women's 100m Hurdles",2021-08-02)
|
||||
-- (E192,ATH,"Women's 5000m",2021-08-02)
|
||||
-- (E193,ATH,"Women's Discus Throw",2021-08-02)
|
||||
-- (E194,BDM,"Men's Singles",2021-08-02)
|
||||
-- (E195,BDM,"Women's Doubles",2021-08-02)
|
||||
-- (E196,CTR,"Women's Team Sprint",2021-08-02)
|
||||
-- (E197,EQU,"Eventing Individual",2021-08-02)
|
||||
-- (E198,EQU,"Eventing Team",2021-08-02)
|
||||
-- (E199,SHO,"25m Rapid Fire Pistol Men",2021-08-02)
|
||||
-- (E200,SHO,"50m Rifle 3 Positions Men",2021-08-02)
|
||||
-- (E201,WLF,"Women's +87kg",2021-08-02)
|
||||
-- (E202,WLF,"Women's 87kg",2021-08-02)
|
||||
-- (E203,WRE,"Men's Greco-Roman 130kg",2021-08-02)
|
||||
-- (E204,WRE,"Men's Greco-Roman 60kg",2021-08-02)
|
||||
-- (E205,WRE,"Women's Freestyle 76kg",2021-08-02)
|
||||
-- (20 lignes)
|
||||
|
||||
-- UPDATE 0
|
||||
|
||||
-- 11. Ecrire une fonction pratique qui retourne le nom de la discipline pratiqué par un athlète dont on passe le code en paramètre
|
||||
|
||||
CREATE OR REPLACE FUNCTION pratique(code_athlete athlete.code%TYPE) RETURNS SETOF discipline AS $$
|
||||
DECLARE
|
||||
discipline discipline;
|
||||
BEGIN
|
||||
FOR discipline IN SELECT * FROM discipline d WHERE d.code IN (SELECT p.discipl FROM pratiquer p WHERE p.athlete = (SELECT a.code FROM athlete a WHERE a.nom = nom AND a.prenom = prenom)) LOOP
|
||||
RETURN NEXT discipline;
|
||||
END LOOP;
|
||||
EXCEPTION
|
||||
WHEN UNIQUE_VIOLATION THEN
|
||||
RAISE NOTICE 'L ''athlète % pratique plusieurs disciplines', code_athlete;
|
||||
WHEN NO_DATA_FOUND THEN
|
||||
RAISE NOTICE 'Athlète % inconnu', code_athlete;
|
||||
END;
|
||||
$$ LANGUAGE plpgsql;
|
||||
|
||||
-- CREATE OR REPLACE FUNCTION pratique(code_athlete varchar) RETURNS SETOF discipline AS $$
|
||||
-- SELECT *
|
||||
-- FROM discipline d
|
||||
-- WHERE d.code IN (SELECT discipl FROM pratiquer WHERE athlete = code_athlete);
|
||||
-- EXEPTION
|
||||
-- WHEN UNIQUE_VIOLATION THEN
|
||||
-- RAISE NOTICE 'L ''athlète % pratique plusieurs disciplines', code_athlete;
|
||||
-- WHEN NO_DATA_FOUND THEN
|
||||
-- RAISE NOTICE 'Athlète % inconnu', code_athlete;
|
||||
-- $$ LANGUAGE SQL;
|
||||
|
||||
-- 12. Utiliser la fonction pratique pour trouver le sport pratiqué par Earvin NGAPETH
|
||||
|
||||
SELECT code
|
||||
FROM athlete
|
||||
WHERE nom = 'NGAPETH' AND prenom = 'Earvin';
|
||||
|
||||
SELECT * FROM pratique('A07318');
|
||||
|
||||
-- code | nom
|
||||
-- ------+------------
|
||||
-- VVO | Volleyball
|
||||
-- (1 ligne)
|
||||
|
||||
-- 13. Meme question pour l'athlete Lotte KOPECKY
|
||||
|
||||
SELECT code
|
||||
FROM athlete
|
||||
WHERE nom = 'KOPECKY' AND prenom = 'Lotte';
|
||||
|
||||
SELECT * FROM pratique('A05315');
|
||||
|
||||
-- code | nom
|
||||
-- ------+---------------
|
||||
-- CRD | Cycling Road
|
||||
-- CTR | Cycling Track
|
||||
-- (2 lignes)
|
||||
|
||||
-- 14. Meme question pour l'thlete de code 'B01' (qui n'existe pas)
|
||||
|
||||
SELECT * FROM pratique('B01');
|
||||
|
||||
|
||||
|
Binary file not shown.
File diff suppressed because it is too large
Load Diff
Binary file not shown.
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Loading…
Reference in new issue