Les Maitres Artisans Index du Forum
 
 
 
Les Maitres Artisans Index du ForumFAQRechercherS’enregistrerConnexion

Pour les curieux...
Aller à la page: 1, 2  >
 
Poster un nouveau sujet   Répondre au sujet    Les Maitres Artisans Index du Forum -> Auberge -> Général
Sujet précédent :: Sujet suivant  
Auteur Message
Rakdos
Membres actifs

Hors ligne

Inscrit le: 05 Juin 2012
Messages: 1 224
Localisation: Avignon
Masculin Vierge (24aoû-22sep)

MessagePosté le: Mer 9 Jan - 13:48 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Bijour,

Certains d'entre vous étaient au courant, d'autre pas... Mardi dernier j'ai eu mon partiel en PL/SQL (Procedural Language / Structured Query Language) voilà ce que ça donne:
1)
CREATE OR REPLACE function affichInfosHotels() RETURNS void as $$
DECLARE
    clef hotel.nom%type;
   
    row record;
    cur cursor FOR
        SELECT * FROM hotel;
   
    rowParam record;   
    curParam cursor (nom_hotel hotel.nom%type) IS
        SELECT l.type_lit
        FROM hotel AS h NATURAL JOIN
        chambre AS c NATURAL JOIN
        literie AS l
        WHERE h.nom = nom_hotel
        GROUP BY c.num_hotel, c.num_lit, l.type_lit;
BEGIN
    OPEN cur;
        LOOP
            FETCH cur INTO row;
            EXIT WHEN NOT FOUND;
           
            RAISE NOTICE 'L\'hôtel "%" localisé à % possède a % chambres. Son numéro de téléphone est le %, le propriétaire s\'apelle %.', row.nom, row.ville, row.nb_ch, row.tel, row.nom_gerant;

            clef := row.nom;
            OPEN curParam(clef);
                LOOP
                    FETCH curParam INTO rowParam;
                    EXIT WHEN NOT FOUND;
                   
                    RAISE NOTICE '--> Cet hôtel possède: %', rowParam.type_lit;
                END LOOP;
            CLOSE curParam;
        END LOOP;
    CLOSE cur;
END;
$$ language plpgsql;

----------------------------------------------------

2)
CREATE TABLE infosClient(
    num_client integer,
    nom varchar(20),
    prenom varchar(20),
    prix integer,
   
    PRIMARY KEY (num_client)
);

CREATE OR REPLACE function affichClients(nom_hotel hotel.nom%type, nom_client client.nom%type, n integer) RETURNS void as $$
DECLARE
    i integer := 1;

    row record;
    cur cursor FOR
        SELECT c.nom, c.prenom, r.date_arrivee FROM
        hotel AS h NATURAL JOIN
        resa AS r JOIN
        client AS c ON (r.num_client = c.num_client)
        WHERE h.nom LIKE nom_hotel
        AND c.nom LIKE nom_client
        GROUP BY c.nom, c.prenom, r.date_arrivee;
       
    rowP record;
    curP cursor (date resa.date_arrivee%type) IS
        SELECT c.num_client, c.nom, c.prenom, t.prix_nuit FROM
        hotel AS h NATURAL JOIN
        tarif AS t NATURAL JOIN
        resa AS r JOIN
        client AS c ON (r.num_client = c.num_client)       
        WHERE r.date_arrivee = date
        AND c.nom NOT LIKE nom_client
        GROUP BY c.num_client, c.nom, c.prenom, t.prix_nuit;
BEGIN
    OPEN cur;
        LOOP
            FETCH cur INTO row;
            EXIT WHEN NOT FOUND;
           
            OPEN curP(row.date_arrivee);
                LOOP
                    FETCH curP INTO rowP;
                    EXIT WHEN NOT FOUND;
                   
                    IF i > n THEN
                        EXIT;
                    END IF;
                   
                    RAISE NOTICE 'Le client % % a aussi réservé le même jour que %.', rowP.nom, rowP.prenom, nom_client;
                    i := i + 1;
                   
                    INSERT INTO infosClient VALUES(
                    rowP.num_client,
                    rowP.nom,
                    rowP.prenom,
                    rowP.prix_nuit
                    );
                END LOOP;
            CLOSE curP;
        END LOOP;
    CLOSE cur;
END;
$$ language plpgsql;

----------------------------------------------------

3)
CREATE OR REPLACE function affichMostSanitaire() RETURNS void as $$
DECLARE
    nbSan sanitaire.num_san%type := 0;
    nom_san sanitaire.type_san%type;
   
    row record;
    cur cursor FOR
        SELECT s.type_san, COUNT(c.num_san) AS "nb"
        FROM hotel AS h NATURAL JOIN
        chambre AS c NATURAL JOIN
        sanitaire AS s       
        WHERE h.ville LIKE 'Paris'
        GROUP BY s.type_san;

BEGIN
    OPEN cur;
        LOOP
            FETCH cur INTO row;
            EXIT WHEN NOT FOUND;
           
            IF row.nb > nbSan THEN
                nbSan := row.nb;
                nom_san := row.type_san;
            END IF;
        END LOOP;
    CLOSE cur;
   
    RAISE NOTICE 'Les sanitaires les plus présents à Paris sont: % pour un total de %.', nom_san, nbSan;
END;
$$ language plpgsql;


Ayant fait 3 questions sur 5 ça promet le beau truc <3 !
-------------------
Requiem aeternam dona eis, Domine, et lux perpetua luceat eis. In memoria aeterna erit justus: ab auditione mala non timebit.
Revenir en haut
Visiter le site web du posteur
Publicité






MessagePosté le: Mer 9 Jan - 13:48 (2013)    Sujet du message: Publicité

PublicitéSupprimer les publicités ?
Revenir en haut
Forthric
Membres hors confrérie

Hors ligne

Inscrit le: 28 Avr 2011
Messages: 350
Localisation: Somewhere in Belgium
Masculin Gémeaux (21mai-20juin)

MessagePosté le: Mer 9 Jan - 15:05 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Hou pinaise. des curseurs !
C'est sans doute spécifique à PL/SQL parce que sous MS SQL, le curseur est clairement pas dans la liste des Best Practices.

Sinon, pour le troisième script, y'a deux trucs qui m'étonnent
- l'utilisation de la constante 'Paris' dans la recherche (mais bon, j'imagine que ça faisait partie de la problématique). Un paramètre pour la ville en entrée permettrait une fonction plus souple.
- Pourquoi ne pas avoir fait un ORDER BY COUNT(c.num_san) DESC et limité le FETCH à une seule ligne ? Parce que là, on va se taper tout le resultset.

Sinon, ça a l'air sympa.
Le sujet complet est visible quelque part ?
-------------------
Être moche n'est pas un handicap, c'est un style de vie.
Revenir en haut
Tapedur
Anti raid, anti poux, anti cons, anti jeu, enfoiré...

Hors ligne

Inscrit le: 24 Sep 2008
Messages: 4 435
Localisation: En face de l'écran !
Masculin Gémeaux (21mai-20juin)

MessagePosté le: Mer 9 Jan - 20:38 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Bon, on vous laisse discuter entre vous, nous on a des tanks à tuer et des escamouches à finir !  super content !
-------------------
- Hache Tendre et Tête de Bois !

- Quand on est jeune on est con ! Je le sais j'ai été jeune !!!

- Je préfère le vin d'ici que l'au-delà - Francis Blanche

Revenir en haut
Noleth
Membres actifs

Hors ligne

Inscrit le: 06 Nov 2008
Messages: 2 075
Localisation: Paris Est-Ouest

MessagePosté le: Jeu 10 Jan - 09:38 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Forthric a écrit:
- Pourquoi ne pas avoir fait un ORDER BY COUNT(c.num_san) DESC et limité le FETCH à une seule ligne ? Parce que là, on va se taper tout le resultset.


Parfaitement d'accord (ou alors avec une requête imbriquée pour récupérer le max de c.num_san et sélectionner juste l'enregistrement nécessaire).

Sinon pour les curseurs, c'est un classique de pas mal de langages basés sur le SQL (j'en bouffe en ce moment avec du SQLRPG)...

Regards,
Noleth
-------------------


Make Love(craft), not War(craft)!
Revenir en haut
Visiter le site web du posteur
Forthric
Membres hors confrérie

Hors ligne

Inscrit le: 28 Avr 2011
Messages: 350
Localisation: Somewhere in Belgium
Masculin Gémeaux (21mai-20juin)

MessagePosté le: Jeu 10 Jan - 10:27 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Noleth a écrit:
Forthric a écrit:
- Pourquoi ne pas avoir fait un ORDER BY COUNT(c.num_san) DESC et limité le FETCH à une seule ligne ? Parce que là, on va se taper tout le resultset.



Parfaitement d'accord (ou alors avec une requête imbriquée pour récupérer le max de c.num_san et sélectionner juste l'enregistrement nécessaire).

Sinon pour les curseurs, c'est un classique de pas mal de langages basés sur le SQL (j'en bouffe en ce moment avec du SQLRPG)...

Regards,
Noleth

La requête imbriquée avec le MAX() utiliserait un poil plus de ressources. A vérifier en fonction des mécanismes du moteur SQL.
Une autre alternative aurait été d'utiliser le mot clé rownum avec une clause WHERE.
Par exemple
SELECT * FROM (SELECT <ma requête au résultat trié>) SortResult WHERE rownum <= 1 ORDER  BY rownum.
C'est un peu du double boulot pour le moteur SQL que d'utiliser un resultset déjà trié pour le trier à nouveau dans son ensemble afin de ne renvoyer que la première ligne... Pas super optimisé non plus.

Du coup, je pense que récupérer un résultat trié en une seule requête et utiliser le FETCH du curseur pour se limiter à la première ligne est bien plus efficace.

Pour en revenir aux curseurs, je sais qu'ils sont encore largement utilisés sur certains moteurs.
Cependant, sous MS SQL Server, ils ont tendance à être dépréciés au profit de techniques plus avancées et plus efficaces (comme les CTE - Common Table Expression).

PS : si tu veux te faire une idée de la puissance des CTE, je te conseille ce petit article introductif

PPS : Ça va Tapedur, t'arrive à suivre ou tu veux une autre aspirine ? ^^
-------------------
Être moche n'est pas un handicap, c'est un style de vie.
Revenir en haut
Noleth
Membres actifs

Hors ligne

Inscrit le: 06 Nov 2008
Messages: 2 075
Localisation: Paris Est-Ouest

MessagePosté le: Jeu 10 Jan - 11:49 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Forthric a écrit:

Cependant, sous MS SQL Server, ils ont tendance à être dépréciés au profit de techniques plus avancées et plus efficaces (comme les CTE - Common Table Expression).


J'ai arrêté de lire à "avancées".

Regards,
Noleth, qui bosse sur le fleuron de la technologie des années 70 Mr. Green
-------------------


Make Love(craft), not War(craft)!
Revenir en haut
Visiter le site web du posteur
Rakdos
Membres actifs

Hors ligne

Inscrit le: 05 Juin 2012
Messages: 1 224
Localisation: Avignon
Masculin Vierge (24aoû-22sep)

MessagePosté le: Jeu 10 Jan - 12:13 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Forthric a écrit:
- l'utilisation de la constante 'Paris' dans la recherche (mais bon, j'imagine que ça faisait partie de la problématique). Un paramètre pour la ville en entrée permettrait une fonction plus souple.
- Pourquoi ne pas avoir fait un ORDER BY COUNT(c.num_san) DESC et limité le FETCH à une seule ligne ? Parce que là, on va se taper tout le resultset.

Sinon, ça a l'air sympa.
Le sujet complet est visible quelque part ?
- L'utilisation du "LIKE 'Paris'" était demandé dans le sujet mais un curseur paramétré aurait été bien utile en effet. Mais non demandé.
- Cela faisait partit du sujet. On était noté sur le fait que ce soit codé "main" et non utiliser les fonctionnalitées du SQL. Comme la 2e requête, j'aurai pu utiliser le "LIMIT" mais on devait faire notre propre incrément... S'pas une question de performance, c'est plus une question d'utilisation du PL en fait ^^.

Malheureusement je peux pas vous filer le sujet, je l'ai pas. Y avait 3 exemplaires de ce sujet là, cependant j'ai le scripts des tables si ça vous chante XD !

Pour les curseurs ben... On est obligé d'en bouffer même si on en veut pas. Y avait des questions sur les triggers mais en 1h30 comprendre les tables, leurs relations, les clés primaires, étrangères et compagnie et élaborer ses propres scripts PL/SQL, s'pas évident x).
-------------------
Requiem aeternam dona eis, Domine, et lux perpetua luceat eis. In memoria aeterna erit justus: ab auditione mala non timebit.
Revenir en haut
Visiter le site web du posteur
Tapedur
Anti raid, anti poux, anti cons, anti jeu, enfoiré...

Hors ligne

Inscrit le: 24 Sep 2008
Messages: 4 435
Localisation: En face de l'écran !
Masculin Gémeaux (21mai-20juin)

MessagePosté le: Jeu 10 Jan - 21:03 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Forthric a écrit:
Noleth a écrit:
Forthric a écrit:






PPS : Ça va Tapedur, t'arrive à suivre ou tu veux une autre aspirine ? ^^


J'arrive parfaitement à suivre même si je trouve ça totalement dénué d'intérêt !


Et si tu pensais que ta petite phrase passerait inaperçue, tu l'as dans le fion !  Laughing Laughing Laughing Laughing Laughing  et  doigt  pour faire bonne mesure !


Sale geek !!!!  Laughing
-------------------
- Hache Tendre et Tête de Bois !

- Quand on est jeune on est con ! Je le sais j'ai été jeune !!!

- Je préfère le vin d'ici que l'au-delà - Francis Blanche

Revenir en haut
Forthric
Membres hors confrérie

Hors ligne

Inscrit le: 28 Avr 2011
Messages: 350
Localisation: Somewhere in Belgium
Masculin Gémeaux (21mai-20juin)

MessagePosté le: Jeu 10 Jan - 22:09 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Tapedur a écrit:

J'arrive parfaitement à suivre même
Prouve le !
-------------------
Être moche n'est pas un handicap, c'est un style de vie.
Revenir en haut
Girdilin
Membres actifs

Hors ligne

Inscrit le: 04 Jan 2010
Messages: 2 618
Localisation: Palais de Thorin
Masculin Sagittaire (22nov-21déc) 牛 Buffle

MessagePosté le: Jeu 10 Jan - 23:19 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Il est derrière moi, à 10m, c'est qu'il suit  Mr. Green
-------------------
Un nain, ça va. Deux... Bonjour les dégâts!
-------------------------------
"Celui qui excelle ne discute pas, il maîtrise sa science et se tait" Lao-Tseu
Revenir en haut
Tapedur
Anti raid, anti poux, anti cons, anti jeu, enfoiré...

Hors ligne

Inscrit le: 24 Sep 2008
Messages: 4 435
Localisation: En face de l'écran !
Masculin Gémeaux (21mai-20juin)

MessagePosté le: Ven 11 Jan - 00:18 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Forthric a écrit:
Tapedur a écrit:
J'arrive parfaitement à suivre même






Prouve le !






En SQL le curseur est le résultat d'une requête et permet de se ballader dans les rangées et colonnes de la requête pour trouver les valeurs que tu cherches.

Et si mes souvenirs sont bons, tu as les curseurs simples, les curseurs scroll, plus l'un ou l'autre dont les noms m'échappent.


Bon, là, je synthétise !


Ca te va comme preuve ou faut que je développe ?  doigt
-------------------
- Hache Tendre et Tête de Bois !

- Quand on est jeune on est con ! Je le sais j'ai été jeune !!!

- Je préfère le vin d'ici que l'au-delà - Francis Blanche

Revenir en haut
Forthric
Membres hors confrérie

Hors ligne

Inscrit le: 28 Avr 2011
Messages: 350
Localisation: Somewhere in Belgium
Masculin Gémeaux (21mai-20juin)

MessagePosté le: Ven 11 Jan - 07:24 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Tsss.
Repomper vaguement le contenu de wikipedia ou d'un site quelconque parlant de base de données n'est pas une preuve ^.

Mais bon, c'est assez approximatif pour faire croire à de vrai souvenirs.

Je t'accorde le bénéfice du doute. Smile
-------------------
Être moche n'est pas un handicap, c'est un style de vie.
Revenir en haut
Tapedur
Anti raid, anti poux, anti cons, anti jeu, enfoiré...

Hors ligne

Inscrit le: 24 Sep 2008
Messages: 4 435
Localisation: En face de l'écran !
Masculin Gémeaux (21mai-20juin)

MessagePosté le: Ven 11 Jan - 13:05 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Dis donc gamin, je pratiquais le Basic, le dbase, le Pascal, voir même l'assembleur que ton père n'avait même pas encore eu l'idée d'engrosser ta mère (funeste idée par ailleurs !!!), alors la ramène pas trop avec tes connaissances partielles ! Voyou, iconoclaste, saltimbanque !!!!  doigt Laughing
-------------------
- Hache Tendre et Tête de Bois !

- Quand on est jeune on est con ! Je le sais j'ai été jeune !!!

- Je préfère le vin d'ici que l'au-delà - Francis Blanche

Revenir en haut
Forthric
Membres hors confrérie

Hors ligne

Inscrit le: 28 Avr 2011
Messages: 350
Localisation: Somewhere in Belgium
Masculin Gémeaux (21mai-20juin)

MessagePosté le: Ven 11 Jan - 14:32 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Tapedur a écrit:
Dis donc gamin, je pratiquais le Basic, le dbase, le Pascal, voir même l'assembleur que ton père n'avait même pas encore eu l'idée d'engrosser ta mère (funeste idée par ailleurs !!!), alors la ramène pas trop avec tes connaissances partielles ! Voyou, iconoclaste, saltimbanque !!!!  doigt Laughing

Digital Dinosaur spotted !

Dis, à l'époque tu sauvegardais tes données sur ce genre de trucs ?
Comme une disquette 8" mais en moins souple Mr. Green



Mine de rien, ça me rappelle mes cours d'informatique de Terminale H.
En gros on a les même bases. (keupaing !)
Sauf que moi après j'ai évolué  Mr. Green
-------------------
Être moche n'est pas un handicap, c'est un style de vie.
Revenir en haut
Yopsolo
Membres actifs

Hors ligne

Inscrit le: 07 Déc 2010
Messages: 1 001
Localisation: Léognan
Masculin Taureau (20avr-20mai) 虎 Tigre

MessagePosté le: Ven 11 Jan - 15:32 (2013)    Sujet du message: Pour les curieux... Répondre en citant

Forthric a écrit:


Mine de rien, ça me rappelle mes cours d'informatique de Terminale H.
En gros on a les même bases. (keupaing !)
Sauf que moi après j'ai évolué  Mr. Green
Tu as prix 30 kg? ^^

L'évolution n'est pas forcément une bonne chose...
-------------------
Mais on va me dire C'est où qu'on signe, bordel!!!
Revenir en haut
Yahoo Messenger Skype
Contenu Sponsorisé






MessagePosté le: Aujourd’hui à 21:45 (2017)    Sujet du message: Pour les curieux...

Revenir en haut
Montrer les messages depuis:   
Poster un nouveau sujet   Répondre au sujet    Les Maitres Artisans Index du Forum -> Auberge -> Général Toutes les heures sont au format GMT + 1 Heure
Aller à la page: 1, 2  >
Page 1 sur 2

 
Sauter vers:  

Portail | Index | créer un forum | Forum gratuit d’entraide | Annuaire des forums gratuits | Signaler une violation | Conditions générales d'utilisation