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 :

curseur dans un trigger


Sujet :

PL/SQL Oracle

  1. #1
    jux
    jux est déconnecté
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 36
    Par défaut curseur dans un trigger
    Bonjour,
    j'ai créé mon premier trigger avec un curseur à l'intérieur :
    la partie du code qui pose problème est en rouge.
    L'exécution du code suivant donne les messages d'erreur suivants :

    LINE/COL ERROR
    27/1 PL/SQL: Statement ignored
    27/28 PLS-00405: sous-interrogation non autorisée dans ce contexte
    31/1 PL/SQL: Statement ignored
    31/23 PLS-00405: sous-interrogation non autorisée dans ce contexte
    39/1 PL/SQL: Statement ignored
    39/24 PLS-00405: sous-interrogation non autorisée dans ce contexte

    /* mon trigger :*/
    create or replace trigger trigger_inscription
    before update or insert on inscription
    for each row
    declare
    nbre_etud number(2,0);
    nbre_module number(2,0);
    cursor curseur_prerequis is select codmodpreq from prerequis start with codmod = :new.codmod connect by prior codmodpreq=codmod;
    codmod_du_curseur prerequis.codmod%type;
    begin
    /*Test si les modules prerequis sont présents dans la table inscription : */
    open curseur_prerequis;
    loop
    fetch curseur_prerequis into codmod_du_curseur;
    exit when curseur_prerequis%notfound;

    if codmod_du_curseur not in(select codmod from inscription where numetud=:new.numetud)
    then raise_application_error ( -20003,'Erreur cet étudiant ne s est pas inscrit dans un(ou les) module(s) prerequis');
    end if;

    if :new.numetud not in(
    select e.numetud from etudiant e
    where not exists(select ex.codmod from examen ex where ex.codmod=codmod_du_curseur and not exists(
    select r.numetud,r.codexam from resultat r,module m where e.numetud=r.numetud
    and ex.codexam=r.codexam)))
    then raise_application_error ( -20004,'Erreur cet étudiant n a pas passé tous les examens dans un des modules prerequis');
    end if;

    if :new.numetud not in (select num_etudiant from vue_trigger3 where code_module=codmod_du_curseur)
    then raise_application_error ( -20005,'Erreur cet étudiant n a pas la moyenne (noteprerequis) dans un des modules prerequis');
    end if;

    end loop;
    close curseur_prerequis;
    end;
    /

    C'EST AU NIVEAU DES 3 IF DANS LE CURSEUR QUE CA COINCE.
    JE NE SAIS PAS SI CE TYPE DE REQUETE EST AUTORISEE ICI.
    MERCI DE VOTRE AIDE D'AVANCE

  2. #2
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Première remarque dans un block plsql le select a la synthaxe suivante
    NB : On utilise le select dans un block plsql s'il ramene une seule ligne( si le nombre de ligne est >1 alors tu auras l'erreur too_many_rows et s'il ramene aucune ligne tu auras l'erreur no_data_found)

    De préférence utiliser le curseur pour ne pas gérer les erreurs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Select champs1,champs2...
    into p1,p2...
    from table ....
    where ...
    Tu peux utiliser le code ci-dessous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    declare 
    .......
    nb_codmod  number(2,0); 
    begin 
    ............
    select  count(codmod) 
    into  nb_codmod 
    from inscription 
    where numetud=:new.numetud and codmod=codmod_du_curseur ;
    if nb_codmod =0 then 
     raise_application_error ( -20003,'Erreur cet étudiant ne s est pas inscrit dans un(ou les) module(s) prerequis');
    end if;
    A la place du code suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    if codmod_du_curseur not in(select codmod from inscription where numetud=:new.numetud)
    then raise_application_error ( -20003,'Erreur cet étudiant ne s est pas inscrit dans un(ou les) module(s) prerequis');
    end if;

  3. #3
    jux
    jux est déconnecté
    Membre averti
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juillet 2002
    Messages
    36
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juillet 2002
    Messages : 36
    Par défaut
    super merci pour le coup de main : j'ai mis des count() partout et ça marche.

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    De rien, n'oublie pas de mettre la discussion a résolu.

  5. #5
    Membre Expert
    Avatar de LeoAnderson
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 2 938
    Par défaut
    NON ! c'est catastrophique pour les perfs !!!
    (et ne me dites pas qu'on s'en fout, en ne s'en fout jamais des perfs, et il faut prendre les bonnes habitudes dès le départ !)

    Si le but est de savoir s'il a ou non des modules, au lieu de tout compter (et potentiellement parcourir des millions de lignes) et juste comparer avec 0 ou 1, il faut travailler par gestion des exceptions !

    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
     
    BEGIN
    ...
       BEGIN
          SELECT  codmod
            INTO ln$codmod 
            FROM inscription 
           WHERE numetud=:new.numetud AND codmod=codmod_du_curseur ;
       EXCEPTIONS
          WHEN NO_DATA_FOUND THEN
             -- C'est qu'il n'a aucune inscription
          WHEN TOO_MANY_ROWS THEN
             -- C'est qu'il a plusieurs inscriptions (2 ? 1000 ? 1 milliard ? peu importe)
       END;
    ...
    END;

  6. #6
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Salut,

    Merci pour ta remarque Leo, C'est bien d'apprendre les bonnes manières et ne jamais négliger la performance.

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

Discussions similaires

  1. Peut on utiliser un curseur dans un trigger ?
    Par funboard dans le forum Oracle
    Réponses: 2
    Dernier message: 26/02/2009, 15h49
  2. select dans un trigger sous Postgresql
    Par kastor_grog dans le forum Requêtes
    Réponses: 1
    Dernier message: 03/09/2003, 17h00
  3. Position du curseur dans un TMemo
    Par yokito dans le forum Composants VCL
    Réponses: 3
    Dernier message: 28/08/2003, 16h35
  4. [PostgreSQL] Refus de STATEMENT dans un trigger
    Par alex2205 dans le forum Requêtes
    Réponses: 3
    Dernier message: 10/03/2003, 12h51
  5. Position du curseur dans Edit
    Par MrJéjé dans le forum C++Builder
    Réponses: 3
    Dernier message: 20/06/2002, 17h09

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