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

  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

  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.

  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 ...

  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