IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Bloc PL/SQL intégrant les requêtes SQL [Fait]


Sujet :

PL/SQL Oracle

  1. #1
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Bloc PL/SQL intégrant les requêtes SQL
    on a deux tables ETUDIANT(numet, Nom, #NumBloc ) et
    BLOC(NumBloc, effectifBloc)

    1-Définir un bloc PL/SQL intégrant les requêtes SQL nécessaires et permettant d'insérer dans la relation BLOC les tuples constitués du numéro de bloc et son effectif calculé.
    2-Terminer le programme en validant la transaction par la commande COMMIT.
    NB: on doit faire en deux cas .le premier sans l'utilisation de curseur et le second en utilisant le curseur [/QUOTE]

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Si j'ai bien compris ton ennoncé, ça peut se faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    /* Sans curseur */
     
    BEGIN
     
    INSERT INTO BLOC
    (SELECT NumBloc, count(*)
    FROM ETUDIANT
    GROUP BY NumBloc);
     
    COMMIT;
     
    END;
    /
     
     
    /* Avec curseur */
     
    DECLARE
     
    	   CURSOR moncurseur IS
    	   SELECT DISTINCT NumBloc
    	   FROM ETUDIANT;
     
    	   enr_moncurseur	moncurseur%rowtype; 
     
    	   compte			NUMBER;
     
    BEGIN
     
    	 FOR enr_moncurseur 
    	 IN moncurseur 
    	 LOOP
       	   	 EXIT WHEN moncurseur%NOTFOUND;
     
    		 	SELECT count(*) INTO compte FROM ETUDIANT WHERE NumBloc = enr_moncurseur.NumBloc;
     
    	   		INSERT INTO BLOC VALUES (enr_moncurseur.NumBloc, compte);
     
    	 END LOOP;
     
    COMMIT;
     
    END;
    /

  3. #3
    McM
    McM est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Juillet 2003
    Messages
    4 580
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Juillet 2003
    Messages : 4 580
    Points : 7 740
    Points
    7 740
    Billets dans le blog
    4
    Par défaut
    Pas besoin de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     EXIT WHEN moncurseur%NOTFOUND;
    dans une boucle FOR LOOP
    More Code : More Bugs. Less Code : Less Bugs
    Mon Blog PL/Sql : Fichier Zip / Image BMP / Lire sqliteDB / QRCode et Images PNG ou BMP

  4. #4
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par Snipah Voir le message
    Si j'ai bien compris ton ennoncé, ça peut se faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    /* Sans curseur */
     
    BEGIN
     
    INSERT INTO BLOC
    (SELECT NumBloc, count(*)
    FROM ETUDIANT
    GROUP BY NumBloc);
     
    COMMIT;
     
    END;
    /
     
     
    /* Avec curseur */
     
    DECLARE
     
    	   CURSOR moncurseur IS
    	   SELECT DISTINCT NumBloc
    	   FROM ETUDIANT;
     
    	   enr_moncurseur	moncurseur%rowtype; 
     
    	   compte			NUMBER;
     
    BEGIN
     
    	 FOR enr_moncurseur 
    	 IN moncurseur 
    	 LOOP
       	   	 EXIT WHEN moncurseur%NOTFOUND;
     
    		 	SELECT count(*) INTO compte FROM ETUDIANT WHERE NumBloc = enr_moncurseur.NumBloc;
     
    	   		INSERT INTO BLOC VALUES (enr_moncurseur.NumBloc, compte);
     
    	 END LOOP;
     
    COMMIT;
     
    END;
    /
    pourquoi tu n'as pas utilisé le fetch dans le cas avec le curseur?

  5. #5
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Parce que avec la syntaxe for, il n'y a pas besoin :
    http://sheikyerbouti.developpez.com/...=Chap1#L1.2.13
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  6. #6
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut un autre problème!!!!
    Citation Envoyé par Snipah Voir le message
    Si j'ai bien compris ton ennoncé, ça peut se faire comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    /* Sans curseur */
     
    BEGIN
     
    INSERT INTO BLOC
    (SELECT NumBloc, count(*)
    FROM ETUDIANT
    GROUP BY NumBloc);
     
    COMMIT;
     
    END;
    /
     
     
    /* Avec curseur */
     
    DECLARE
     
    	   CURSOR moncurseur IS
    	   SELECT DISTINCT NumBloc
    	   FROM ETUDIANT;
     
    	   enr_moncurseur	moncurseur%rowtype; 
     
    	   compte			NUMBER;
     
    BEGIN
     
    	 FOR enr_moncurseur 
    	 IN moncurseur 
    	 LOOP
       	   	 EXIT WHEN moncurseur%NOTFOUND;
     
    		 	SELECT count(*) INTO compte FROM ETUDIANT WHERE NumBloc = enr_moncurseur.NumBloc;
     
    	   		INSERT INTO BLOC VALUES (enr_moncurseur.NumBloc, compte);
     
    	 END LOOP;
     
    COMMIT;
     
    END;
    /
    Remarque:
    tenir compte de la possibilité de n'avoir aucu tuple dans la relation ETUDIANT . dans ce cas , un groupe de valeurs nulles(NULL) doit être inséré dans la relation BLOC.

  7. #7
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Tu ne vas pas nous demander de faire tout ton exercice ?

    Cherche un peu. Proposes-nous les solutions que tu as testées, indiques-nous pourquoi elles ne fonctionnent pas (avec le code erreur s'il y en a). Ce sera beaucoup plus profitable pour toi.
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  8. #8
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut j'essais
    j'essais

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    861
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 861
    Points : 965
    Points
    965
    Par défaut
    Citation Envoyé par McM Voir le message
    Pas besoin de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     EXIT WHEN moncurseur%NOTFOUND;
    dans une boucle FOR LOOP
    C'est juste

  10. #10
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut
    Citation Envoyé par plaineR Voir le message
    Tu ne vas pas nous demander de faire tout ton exercice ?

    Cherche un peu. Proposes-nous les solutions que tu as testées, indiques-nous pourquoi elles ne fonctionnent pas (avec le code erreur s'il y en a). Ce sera beaucoup plus profitable pour toi.
    voici ce que je proposes:
    /* Sans curseur */

    BEGIN
    IF ETUDIANT% FOUND THEN
    INSERT INTO BLOC
    (SELECT NumBloc, count(*)
    FROM ETUDIANT
    GROUP BY NumBloc);
    ELSE
    INSERT INTO BLOC VALUES (0, 0);
    END IF;

    COMMIT;

    END;
    /


    /* Avec curseur */

    DECLARE

    CURSOR moncurseur IS
    SELECT DISTINCT NumBloc
    FROM ETUDIANT;

    enr_moncurseur moncurseur%rowtype;

    compte NUMBER;

    BEGIN

    FOR enr_moncurseur
    IN moncurseur
    LOOP
    EXIT WHEN moncurseur%NOTFOUND;

    SELECT count(*) INTO compte FROM ETUDIANT WHERE NumBloc = enr_moncurseur.NumBloc;
    IF ETUDIANT% FOUND THEN
    INSERT INTO BLOC VALUES (enr_moncurseur.NumBloc, compte);
    ELSE
    INSERT INTO BLOC VALUES (0, 0);
    END IF;
    END LOOP;

    COMMIT;

    END;
    /

  11. #11
    Membre expert

    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Janvier 2004
    Messages
    2 862
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Chef de projet en SSII
    Secteur : Conseil

    Informations forums :
    Inscription : Janvier 2004
    Messages : 2 862
    Points : 3 609
    Points
    3 609
    Par défaut
    Merci d'utiliser les balises CODE (# dans la barre d'outils), pour améliorer la lisibilité de ton code

    Bon, c'est pas bon du tout ce que tu as fait.

    1è cas : sans curseur :
    le "IF ETUDIANT%FOUND" ne veut rien dire. Il faudrait que "EDTUDIANT corresponde à un curseur. Ce qu'il faut que tu fasses, c'est que tu testse si ta requête insert a trouvé au moins un enregistrement.
    Pour cela tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if sql%notfound then ...
    Par ailleurs je te conseille de toujours nommer tes colonnes quand tu fais un insert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO BLOC(NumBloc, effectifBloc) ....
    2è cas : avec curseur :
    Déjà tu aurais du tenir compte de la remarque de McM et lire le tuto que je t'avais donné : le exit ne sert à rien.
    Après tu as 2 solutions :
    - si tu utilises un for, tu as besoin d'une variable pour indiquer si tu as au moins un enregistrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    v_exist := false;
    for mavar in moncurseur loop
      v_exist := true;
      ...
    end loop;
    if not v_exist then 
       insert into ...
    - si tu utilises la syntaxe open ... fetch, il faut que tu testes avant de fermer ton curseur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if moncurseur%found then ...
    Un problème sans solution est un problème mal posé

    Merci de poser vos questions sur le forum, je ne réponds pas aux questions posées par MP.

  12. #12
    Membre à l'essai
    Inscrit en
    Mars 2008
    Messages
    31
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 31
    Points : 20
    Points
    20
    Par défaut Merci beaucoup pour ton aide
    Citation Envoyé par plaineR Voir le message
    Merci d'utiliser les balises CODE (# dans la barre d'outils), pour améliorer la lisibilité de ton code

    Bon, c'est pas bon du tout ce que tu as fait.

    1è cas : sans curseur :
    le "IF ETUDIANT%FOUND" ne veut rien dire. Il faudrait que "EDTUDIANT corresponde à un curseur. Ce qu'il faut que tu fasses, c'est que tu testse si ta requête insert a trouvé au moins un enregistrement.
    Pour cela tu peux utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if sql%notfound then ...
    Par ailleurs je te conseille de toujours nommer tes colonnes quand tu fais un insert :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO BLOC(NumBloc, effectifBloc) ....
    2è cas : avec curseur :
    Déjà tu aurais du tenir compte de la remarque de McM et lire le tuto que je t'avais donné : le exit ne sert à rien.
    Après tu as 2 solutions :
    - si tu utilises un for, tu as besoin d'une variable pour indiquer si tu as au moins un enregistrement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    v_exist := false;
    for mavar in moncurseur loop
      v_exist := true;
      ...
    end loop;
    if not v_exist then 
       insert into ...
    - si tu utilises la syntaxe open ... fetch, il faut que tu testes avant de fermer ton curseur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if moncurseur%found then ...
    MERCI

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 13/12/2011, 17h21
  2. LINQ to SQL] Tracer les requêtes SQL d'Insert/Update/Delete
    Par annalady dans le forum Accès aux données
    Réponses: 5
    Dernier message: 30/07/2009, 10h17
  3. Réponses: 3
    Dernier message: 05/06/2008, 15h12
  4. [iBatis] Logger les requètes SQL
    Par bslota dans le forum Persistance des données
    Réponses: 2
    Dernier message: 25/11/2005, 14h29
  5. tracer les requêtes SQL
    Par izioto dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 13/10/2005, 16h35

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo