+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Invité régulier
    Étudiant
    Inscrit en
    novembre 2012
    Messages
    9
    Détails du profil
    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : novembre 2012
    Messages : 9
    Points : 6
    Points
    6

    Par défaut Curseur et trigger complexe (du moins pour moi)

    Bonjour

    j'ai passé toute la soirée sur ce trigger
    C'est mon premier trigger avec curseur et de loin le plus compliqué que j'ai pu construire soyez indulgent.
    NB: Je suis sur oracle 10g.
    Code :
    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
    create or replace trigger TRG_trigger1
    AFTER INSERT ON PRODUIT
    FOR EACH ROW
    DECLARE 
    /* Le but recherché est de sélectionner les produits ( s'il en existe ) dont le NUM 
    est supérieur à l'insertion et dont la catégorie num est identique à celle de l'insertion. 
    J'espère ne pas mettre trompé sur la syntaxe */
    	CURSOR cur_produit IS 
    		SELECT produitNUM 
    		FROM CONSTITUER 
    		WHERE produitNUM > :new.produitNUM 
    		AND categNUM = 
    			( 
    			SELECT categNUM 
    			FROM CONSTITUER
    			WHERE :new.produitNUM = produitNUM
    			); 
    	V_produit CONSTITUER.produitNUM%TYPE;
    BEGIN
    	OPEN cur_produit;
    	LOOP
    		FETCH cur_produit INTO V_produit;
    		IF (cur_produit%FOUND) THEN
    /* Si un produit dont l'ID est supérieur et de même catégorie que le produit insérer, alors  instruction 1 : */
    		INSERT INTO OCCURENCE_produit@LIEN_DW
    		VALUES (:new.OCCVNUM, :new.OOCVDATE, :new.OCCVETAT, :new.produitNUM, 0, 0);
    		ELSE
    /* Sinon aucun produit dont l'ID est supérieur et de même catégorie, alors instruction 2 : */
    			INSERT INTO OCCURENCE_produit@LIEN_DW
    			VALUES (:new.OCCVNUM, :new.OOCVDATE, :new.OCCVETAT, :new.produitNUM, 0, 0);
    			INSERT INTO OCCURENCE_categ@LIEN_DW
    			VALUES ('', sysdate,0 ,0 ,0);
    			EXIT;
    		END IF;
    	END LOOP;
    	CLOSE cur_produit;
    END;
    Alors chose incroyable, à peine sortie de l'éditeur de code , j’exécute le trigger :aucune erreur !! une première pour moi :p. Mais malheureusement, il ne fait absolument pas ce que je souhaitais
    Serriez vous pourquoi ??

    Un immense merci par avance.

    Nb: je précise que malheureusement le but de l'exercice (scolaire) et de faire un gros curseur, sur lequel on applique %FOUND.

    EDIT: Je crois comprendre que c'est la définition du curseur qui cloche . L'utilisation de :new n'est ( à priori) pas possible dans la déclaration du curseur, mais je ne vois pas par qu'elle procédé utilisé les substituer??

  2. #2
    Membre du Club
    Homme Profil pro
    ingénieur d'étude PL/SQL
    Inscrit en
    octobre 2002
    Messages
    50
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur d'étude PL/SQL

    Informations forums :
    Inscription : octobre 2002
    Messages : 50
    Points : 50
    Points
    50

    Par défaut

    tu veux que :new.produitNUM (nouveau produit dont id est superieur à ceux existant) soit inseré ?

    je pence que c'est ton curseur qui n'est pas correct

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CURSOR cur_produit IS 
            SELECT produitNUM 
            FROM CONSTITUER 
            WHERE produitNUM < :new.produitNUM 
            AND categNUM = 
                ( 
                SELECT categNUM 
                FROM CONSTITUER
                WHERE :new.produitNUM = produitNUM
                );

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •