You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
252 lines
7.9 KiB
252 lines
7.9 KiB
-- 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');
|
|
|
|
|
|
|