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

SQL Oracle Discussion :

[9][10]trigger fonction varray ?


Sujet :

SQL Oracle

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 198
    Par défaut [9][10]trigger fonction varray ?
    Bonsoir,

    voilà j'ai pas mal de table qui doive faire l'objet d'un trigger qui execute tjrs le même raisonnement c'est à dire calculer 3 valeurs pour mettre dans 3 champs.

    le calcul de ces trois valeurs est complexe, et nécessite de temps en temps des ajustements assez fin.

    aussi j'aurai souhaité faire un trigger colonne qui appelle une fonction "myfunction(myvalue)" qui renverrait mes 3 valeurs

    mais là problème comment faire pour que ma fonction renvoit 3 valeurs,

    VARRAY serait il une bonne solution ?

    merci de vos conseil

    Luna

  2. #2
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    C'est quoi pour toi un trigger colonne ?
    Sinon, utilise une procédure avec 3 paramètres OUT
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CREATE PROCEDURE MyProc( myvalue IN NUMBER, ret1 OUT NUMBER, ret2 OUT VARCHAR2, ret3 OUT DATE) IS ...

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 198
    Par défaut
    Ben un trigger colonne pour moi c'est un trigger qui déclenche sur la mise à jour d'une colonne

    merci

    Luna

  4. #4
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Sinon tu peux aussi faire un "record" dans un package
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Create or replace pkgtest as
     TYPE t_rec_test IS RECORD (
          valeur1 NUMBER,
          valeur2 VARCHAR2(32),
          valeur3 DATE
       );
     Function MyFunc( myvalue IN NUMBER) RETURN t_rec_test;
    end pkgtest;
    un fonction qui renvoie ton record
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    CREATE OR REPLACE PACKAGE BODY pkgtest
    IS
       FUNCTION myfunc (myvalue IN NUMBER)
          RETURN t_rec_test
       IS
          v_rec_test   t_rec_test;
       BEGIN
          ....
          RETURN v_rec_test;
       END myfunc;
    END pkgtest;
    et DAns ton trigger

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE OR REPLACE TRIGGER matable_air
       AFTER INSERT
       ON matable
       FOR EACH ROW
    DECLARE
       v_rec_test   pkgtest.t_rec_test;
    BEGIN
       ....
       v_rec_test := pkgtest.myproc (:NEW.champ);
       :NEW.a := v_rec_test.valeur1;
       :NEW.b := v_rec_test.valeur2;
       ....
    END;

  5. #5
    McM
    McM est déconnecté
    Expert confirmé

    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
    Billets dans le blog
    4
    Par défaut
    C'est un peu sortir la grosse artillerie pour rien.

    Sauf si la fonction est super compliquée, et que les données d'entrées sont souvent identiques, alors oui, tu peux tester des valeurs de session, et ne faire la fonction que si les données d'entrée ont changé.

  6. #6
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Citation Envoyé par McM
    C'est un peu sortir la grosse artillerie pour rien.
    Oui (quoique ), mais en général, j'essaye d'eviter les paramètres en OUT !
    De plus tu peux eventuellement rajouter des valeurs sans avoir à changer la déclaration de ta fonction et tous les appels à cette dernière.
    Aprés, ca dépend de ta facon de programmer !
    Nota : Pour le changement de valeur de certaines colonnes, on peut utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    CREATE OR REPLACE TRIGGER matable_air
       AFTER UPDATE OF champ1,champ2
       ON matable
       FOR EACH ROW
    DECLARE
    Ou la clause WHEn dans la déclaration de ton trigger

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 198
    Par défaut
    Euh... suis un peu perdu ca va trop vite pour moi, et comme je suis pas trés à l'aise avec les packages et procédures...

    je me suis repenché sur fonction et varray et à partir de ces 2 liens :

    http://www.oracle.com/technology/sam...ray/index.html

    et

    http://www.developpez.net/forums/sho...ghlight=varray

    j'ai mis ca au point :

    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
    CREATE OR REPLACE TYPE varray_test is VARRAY(3) OF number;
     
    CREATE OR REPLACE  FUNCTION "GET_VARRAY_TEST" 
    (
     V number
    )
    return varray_test
    as
    tab varray_test :=varray_test();
    begin
    tab.extend;
    tab(1):= v * 3;
    tab.extend;
    tab(2):= v /3;
    tab.extend;
    tab(3):= v * v;
    return tab;
    end;
    puis pour tester :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select get_varray_test(5) from dual;
     
    GET_VARRAY_TEST(5)
    --------------------------------------
    VARRAY_TEST(15, 1.66666667, 25)
    et encore tester ds sql+ pour plus tard mettre mon trigger en place sur ce principe :

    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
     
    set serveroutput on;
    DECLARE
    	   TAB varray_test := varray_test();
    BEGIN
    execute immediate 'select get_varray_test(5) from dual' into tab;
    	 FOR I IN 1..3
    	 LOOP
    	 	 DBMS_OUTPUT.PUT_LINE(TAB(I));
    	 END LOOP;
    END;
     
    15
    1.66666666666666666666666666666666666667
    25
     
    PL/SQL procedure successfully completed.
    ce qui donne un trigger :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    CREATE OR REPLACE TRIGGER "MYSCHEMA"."MYTRIGGER" 
        BEFORE
    UPDATE OF "MYFIELD" ON "MYSCHEMA"."MYTABLE" FOR EACH ROW DECLARE
     myvar varray_test :=  varray_test();
    BEGIN
     
    execute immediate 'select get_varray_test(:1) from dual' into myvar using :NEW.MYFIELD;
     
    :NEW.MYFIELD1 := myvar(1);
    :NEW.MYFIELD2 := myvar(2);
    :NEW.MYFIELD3 := myvar(3);
     
    END;
    en dernier ne pas oublier les privilèges execute type et execute fonction si le type utilisateur et la fonction ne sont pas ds le même schéma que le trigger je me suis fait avoir...

    si vous aves des critiques constructives je suis preneur

    Merci à vous ca me fait vraiment avancer !

    Luna

  8. #8
    Membre Expert Avatar de Garuda
    Homme Profil pro
    Chef de projet / Urbaniste SI
    Inscrit en
    Juin 2007
    Messages
    1 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Chef de projet / Urbaniste SI
    Secteur : Bâtiment

    Informations forums :
    Inscription : Juin 2007
    Messages : 1 285
    Par défaut
    Inutile de faire un 'execute immediate'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    CREATE OR REPLACE TRIGGER "MYSCHEMA"."MYTRIGGER" 
        BEFORE
    UPDATE OF "MYFIELD" ON "MYSCHEMA"."MYTABLE" FOR EACH ROW 
    DECLARE
    myvar varray_test :=  varray_test();
    BEGIN
    myvar:=get_varray_test(:NEW.MYFIELD);
    
    :NEW.MYFIELD1 := myvar(1);
    :NEW.MYFIELD2 := myvar(2);
    :NEW.MYFIELD3 := myvar(3);
    
    END;

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    198
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 198
    Par défaut
    Merci, je savais pas

    c'est effectivement plus propre

    Luna

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

Discussions similaires

  1. Trigger fonction C
    Par pouf_ dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 12/10/2009, 10h48
  2. trigger fonctions je suis perdu
    Par bastboost dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 27/05/2008, 12h40
  3. Réponses: 11
    Dernier message: 20/12/2005, 18h40
  4. lancer fonction sans trigger
    Par $grm$ dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 04/04/2005, 10h58
  5. Trigger fonction en C
    Par prezgob dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 18/02/2005, 18h06

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