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 :

[Ora9207] Before insert trigger <> blob field


Sujet :

PL/SQL Oracle

  1. #1
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut [Ora9207] Before insert trigger <> blob field
    Salut,

    Je suis en 9.2.0.7 sur le serveur, et j'utilise OraOle for ODBC 9.2.0.8

    J'ai un trigger before insert or update or delete qui consiste basiquement à répliquer des tables en ajoutant des infos de style date etc.

    Lors de la réplication d'un champ BLOB, je pointe :new.champ, champ%TYPE = BLOB;

    Sur l'événement UPDATE, le blob est correctement répliqué
    Sur l'événement INSERT ou DELETE, le blob est vide à l'arrivée

    Dans tous les cas j'utilise :new

    exemple de 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
    15
    CREATE OR REPLACE TRIGGER trg_CODMETHODSRC BEFORE INSERT OR UPDATE OR DELETE ON CODMETHODSRC FOR EACH ROW 
    ...
    
        IF INSERTING THEN 
            MERGE INTO E1XL0.CODMETHODSRC d USING (SELECT 1 FROM dual) 
    ON (...) 
    WHEN MATCHED THEN UPDATE SET d.IMAGE = :new.IMAGE ...
    WHEN NOT MATCHED THEN INSERT (d.VERSION,d.PACKAGE,d.TARGET,d.RESOURCENAME,d.RESOURCEKIND,d.IMAGE,d.LOCKED,d.CHG_DATE,d.CHG_USER,d.CHG_TYPE,d.ID) VALUES (:new.VERSION,:new.PACKAGE,:new.TARGET,:new.RESOURCENAME,:new.RESOURCEKIND,:new.IMAGE,:new.LOCKED,dteTimeStamp,NULL,strChgType,:new.VERSION || '-' || :new.PACKAGE || '-' || :new.TARGET || '-' || :new.RESOURCENAME || '-' || :new.RESOURCEKIND);
        ELSIF UPDATING THEN 
            MERGE INTO E1XL0.CODMETHODSRC d USING (SELECT 1 FROM dual) 
    ON (...) 
    WHEN MATCHED THEN UPDATE SET d.IMAGE = :new.IMAGE ...
    WHEN NOT MATCHED THEN INSERT (d.VERSION,d.PACKAGE,d.TARGET,d.RESOURCENAME,d.RESOURCEKIND,d.IMAGE,d.LOCKED,d.CHG_DATE,d.CHG_USER,d.CHG_TYPE,d.ID) VALUES (:new.VERSION,:new.PACKAGE,:new.TARGET,:new.RESOURCENAME,:new.RESOURCEKIND,:new.IMAGE,:new.LOCKED,dteTimeStamp,NULL,strChgType,:new.VERSION || '-' || :new.PACKAGE || '-' || :new.TARGET || '-' || :new.RESOURCENAME || '-' || :new.RESOURCEKIND);
        END IF;
    Bizarre non ?

  2. #2
    Expert éminent sénior
    Avatar de SheikYerbouti
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    6 760
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 6 760
    Points : 11 862
    Points
    11 862
    Par défaut
    A confirmer, mais il me semble qu'en 9, il n'est pas possible de faire un insert direct avec un BLOB. Il faut soit créer l'enregistrement avec empty_blob() puis faire un update, soit faire un Insert AS Select ...

  3. #3
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    et bien ça me semble logique, puisqu'on ne peut pas non plus faire d'insert à la mimine hors trigger. Je vais suivre cette piste, merci

  4. #4
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Déjà je ne vois pas comment ce code peut marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ...
    IF INSERTING THEN 
            MERGE INTO E1XL0.CODMETHODSRC d USING (SELECT 1 FROM dual) 
    ON (...) WHEN MATCHED THEN UPDATE SET d.IMAGE = :new.IMAGE 
    ...
    Pourriez-vous poster l'exemple (simplifié) complet ?

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    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
    CREATE OR REPLACE TRIGGER trg_CODMETHODSRC BEFORE INSERT OR UPDATE OR DELETE ON CODMETHODSRC FOR EACH ROW 
    DECLARE
        strChgTypeOld VARCHAR2(16);
        strChgType    VARCHAR2(16);
        strWhereStmt  VARCHAR2(2000);
        dteTimeStamp  TIMESTAMP;
    BEGIN 
        --Get the old change type :
        BEGIN
            SELECT d.chg_type INTO strChgTypeOld FROM E1XL0.CODMETHODSRC d 
            WHERE d.VERSION=:new.VERSION AND d.PACKAGE=:new.PACKAGE AND d.TARGET=:new.TARGET AND d.RESOURCENAME=:new.RESOURCENAME AND d.RESOURCEKIND=:new.RESOURCEKIND;
        EXCEPTION 
            WHEN NO_DATA_FOUND THEN strChgTypeOld := NULL;
            WHEN OTHERS THEN RAISE;
        END;              
        --Get the current timestamp :
        SELECT CURRENT_TIMESTAMP INTO dteTimeStamp FROM DUAL;
        --Add the new columns value :
        IF INSERTING THEN 
            strChgType :='INSERT'; 
            MERGE INTO E1XL0.CODMETHODSRC d USING (SELECT 1 FROM dual) 
    ON (d.VERSION=:new.VERSION AND d.PACKAGE=:new.PACKAGE AND d.TARGET=:new.TARGET AND d.RESOURCENAME=:new.RESOURCENAME AND d.RESOURCEKIND=:new.RESOURCEKIND) 
    WHEN MATCHED THEN UPDATE ...
    WHEN NOT MATCHED THEN INSERT ...;
        ELSIF UPDATING THEN 
            IF strChgTypeOld = 'INSERT' THEN 
                strChgType :='INSERT'; 
            ELSE 
                strChgType :='UPDATE'; 
            END IF;
            MERGE INTO E1XL0.CODMETHODSRC d USING (SELECT 1 FROM dual) 
    ON (d.VERSION=:new.VERSION AND d.PACKAGE=:new.PACKAGE AND d.TARGET=:new.TARGET AND d.RESOURCENAME=:new.RESOURCENAME AND d.RESOURCEKIND=:new.RESOURCEKIND)
    WHEN MATCHED THEN UPDATE ...
    WHEN NOT MATCHED THEN INSERT ...;
        ELSIF DELETING THEN 
            ...
        END IF; 
    END;

  6. #6
    Expert éminent sénior Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Points : 11 252
    Points
    11 252
    Par défaut
    Je ne sais pas si ce truc marche correctement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    ...
            MERGE INTO E1XL0.CODMETHODSRC d USING (SELECT 1 FROM dual) 
    ON (d.VERSION=:new.VERSION AND d.PACKAGE=:new.PACKAGE AND d.TARGET=:new.TARGET AND d.RESOURCENAME=:new.RESOURCENAME AND d.RESOURCEKIND=:new.RESOURCEKIND) 
    WHEN MATCHED THEN UPDATE ...
    A la limite j'utiliserais plutôt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
            MERGE INTO E1XL0.CODMETHODSRC d USING (
                  SELECT :new.VERSION version, 
                         :new.PACKAGE package,
                         ... 
                  FROM dual
                  ) t
    ON (d.VERSION=t.VERSION AND d.PACKAGE=t.PACKAGE AND ... 
    WHEN MATCHED THEN UPDATE ...

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2006
    Messages
    1 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : Argentine

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Octobre 2006
    Messages : 1 173
    Points : 1 418
    Points
    1 418
    Par défaut
    je sais pas trop, mon code fonctionne c'est tout ce que je sais (sauf la partie trigger ) car en prod depuis quelques jours et les résultats sont là

    par contre je prends note de ta suggestion, c'est plus propre.

    A+ merci

Discussions similaires

  1. before insert trigger en sql
    Par trovillione dans le forum MS SQL Server
    Réponses: 12
    Dernier message: 15/12/2009, 11h01
  2. Trigger Before Insert et Before Update
    Par NicoNours dans le forum SQL Procédural
    Réponses: 4
    Dernier message: 14/08/2007, 10h20
  3. Trigger : Before insert
    Par guitou0 dans le forum Développement
    Réponses: 6
    Dernier message: 29/06/2007, 11h39
  4. Trigger Before Insert
    Par Fred_ET dans le forum Administration
    Réponses: 7
    Dernier message: 22/11/2006, 00h29
  5. Créer un trigger "before insert" avec SQL Server
    Par bubi dans le forum Développement
    Réponses: 2
    Dernier message: 14/11/2005, 10h12

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