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

Oracle Discussion :

Trigger sur colonne CLOB


Sujet :

Oracle

  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Points : 68
    Points
    68
    Par défaut Trigger sur colonne CLOB
    Bonjour

    Nous avons un problème avec un trigger.
    Nous avons une table qui contient un champ CLOB. Lors de l'insertion dans cette table nous utilisons la méthode empty_clob() pour remplir ce champ (ce champ est donc renseigné après le INSERT via un dbms_lob.Write(...) ). Or nous voudrions créer un trigger qui se place sur les insertions de cette table, et qui modifie un champ de la table au moment de l'insertion en fonction du contenu de ce champ de type CLOB. Le problème est que ce trigger lève une exception Oracle du type :

    [06/12/2007 11:16:04.615 - 5 ms] {7} <E2BSenderOracle/E2BSenderOracle.cpp:167> Probleme lors de la connection Oracle : Error Code : 22275, Error Message : ORA-22275: invalid LOB locator specified
    ORA-04088: error during execution of trigger 'RISKV52D.TS_SWITCH_ASIA'
    ORA-06512: at "RISKV52D.TS2EDA", line 6
    ORA-06512: at line 1
    PS : ce message contient des erreurs liées au code, l'erreur oracle qui nous intéresse est à la 3eme ligne

    En effet, lorsque le trigger essaie d'accéder au champ de type CLOB (le champ se nomme 'xml') le champ n'est pas encore renseigné d'où l'erreur.

    Avez-vous une idée de comment faire un trigger dans ce cas, ou y-a-t-il une autre solution que nous ne connaissons pas pour modifier un champ d'une table en fonction du contenu d'un autre champ de type CLOB.


    Merci d'avance de vos idées

    jeeps64

  2. #2
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    ça ressemble étrangement à ceci : http://www.developpez.net/forums/sho...dbms_lob.Write

  3. #3
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Points : 68
    Points
    68
    Par défaut
    Normal, c'est un collegue !!
    Désolé : (
    Je teste la solution donnée

    Merci
    jeeps64

  4. #4
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Points : 68
    Points
    68
    Par défaut
    J'ai modifié le :
    en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AND  DBMS_LOB.INSTR(body,'toto') > 0
    j'ai toujours le message :
    ORA-22275: invalid LOB locator specified
    ORA-06512: at "SYS.DBMS_LOB", line 690
    ORA-06512: at "RISKV52D.TS_SWITCH_ASIA", line 4
    ORA-04088: error during execution of trigger 'RISKV52D.TS_SWITCH_ASIA'
    ORA-06512: at "RISKV52D.TS2EDA", line 6
    ORA-06512: at line 1

    Comprend pas

    jeeps64

  5. #5
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Points : 68
    Points
    68
    Par défaut
    Voici un test simple que je fais et qui montre mon probleme

    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
    drop table testjp
    create table testjp(a int,b clob null,c char(4))
     
    DROP TRIGGER TS_TESTJP
    CREATE OR REPLACE TRIGGER TS_TESTJP
    BEFORE INSERT 
    ON testjp
    REFERENCING OLD AS OLD NEW AS NEW
    FOR EACH ROW WHEN (
    (NEW.a = 1)
          ) 
    DECLARE
    LExistant NUMBER;
    BEGIN
           IF(dbms_lob.instr(:NEW.b,'TEST') > 0 ) THEN
                :NEW.c := 'Asie';
           END IF;
    END;
     
    /
     
     
    insert into testjp values (1,'lgkjds mlkgsdùmkl qlkngsk gzeopin,gzer TEST pkojgsd^lpbgsdg$^gsùmd','Euro')
    Ceci ne plante pas
     
    select * from testjp -- where DBMS_LOB.INSTR(b,'TEST')>0
     
     
    insert into testjp (a, b, c) values (1, empty_clob(),'TTTT')
    Ce dernier me plante avec l'erreur en question

    Cdlt,
    jeeps64

  6. #6
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Apparemment tu as oublié de lire ceci : http://www.developpez.net/forums/showthread.php?t=28716

  7. #7
    Membre expert

    Profil pro
    Inscrit en
    Février 2006
    Messages
    3 437
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 3 437
    Points : 3 597
    Points
    3 597
    Par défaut
    Je n'arrive pas à reproduire votre problème avec 10.2.0.2.
    Vous pouvez aussi essayer de mettre NULL dans la colonne.

    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
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    dev001> drop table testjp;
     
    Table dropped.
     
    dev001>
    dev001> create table testjp(a int,b clob null,c char(4));
     
    Table created.
     
    dev001>
    dev001> CREATE OR REPLACE TRIGGER TS_TESTJP
      2  BEFORE INSERT
      3  ON testjp
      4  REFERENCING OLD AS OLD NEW AS NEW
      5  FOR EACH ROW
      6  DECLARE
      7  LExistant NUMBER;
      8  BEGIN
      9  IF(dbms_lob.instr(:NEW.b,'TEST') > 0 ) THEN
     10  :NEW.c := 'Asie';
     11  END IF;
     12  END;
     13  /
     
    Trigger created.
     
    dev001> show errors
    No errors.
    dev001>
    dev001>
    dev001> insert into testjp values (1,'lgkjds mlkgsd¨mkl qlkngsk gzeopin,gzer TES
    T pkojgsd^lpbgsdg$^gs¨md','Euro');
     
    1 row created.
     
    dev001>
    dev001>
    dev001> insert into testjp (a, b, c) values (2, null,'TTTT');
     
    1 row created.
     
    dev001>
    dev001> insert into testjp (a, b, c) values (3, empty_clob(),'TTTT');
     
    1 row created.
     
    dev001>
    dev001> select a from testjp;
     
             A
    ----------
             1
             2
             3

  8. #8
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Points : 68
    Points
    68
    Par défaut
    La version de ORACLE est 9.2.0.5

    Avec null, ca marche bien en effet et en 10G, ca marche aussi
    Le seul soucis vient de l'appel de la fonction empty_clob() (enfin je pense)

    Merci de ton aide pifor

    jeeps64

  9. #9
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    pour info : c'est la dernière fois que je formate les messages à ta place

    Si tu désactives le trigger t'as toujours l'erreur ? Si tu exécutes le code du trigger ça fonctionne ?

  10. #10
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Points : 68
    Points
    68
    Par défaut
    Si je désactive le Trigger, ca marche en effet très bien
    L'execution du trigger aussi

    Je suis désolé pour le formattage, je ne comprend pas ce que tu veux dire
    On ne me l'a jamais dis encore (je suis plutot coté SYBASe d'habitude)
    JE vais lire ton tuto

    Encore désolé

    jeeps64

  11. #11
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Citation Envoyé par jeeps64 Voir le message
    Je suis désolé pour le formattage, je ne comprend pas ce que tu veux dire
    Lis les règles du forum et

  12. #12
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Points : 68
    Points
    68
    Par défaut
    OK

    Ce coup ci, j'ai compris !!!
    Ca resoud pas mon pb par contre


    jeeps64

  13. #13
    Expert éminent sénior
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Points : 19 073
    Points
    19 073
    Par défaut
    Apparemment c'est une limitation de la 9i

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
      1  declare
      2  x CLOB := empty_clob();
      3  y number;
      4  begin
      5  y := dbms_lob.instr(x,'toto');
      6* end;
    SYSTEM@lcaprd1>/
    declare
    *
    ERROR at line 1:
    ORA-22275: invalid LOB locator specified
    ORA-06512: at "SYS.DBMS_LOB", line 690
    ORA-06512: at line 5
    Voila ce que dit Oracle :
    Cause
    The cause of this error is due to a restriction. A LOB Location returned from the EMPTY_CLOB, EMPTY_BLOB function is uninitialized and can not be used as a parameter to the DBMS_LOB package.
    Une alternative :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    declare
    x CLOB;
    begin
    dbms_lob.createtemporary(x,true,dbms_lob.session);
    INSERT INTO testjp (a, b, c) VALUES (1, x,'TTTT');
    end;
    /

  14. #14
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    137
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 137
    Points : 68
    Points
    68
    Par défaut
    Cool, je vais tester cette alternative
    Merci encore

    jeeps64

    nb: je vais faire attention aux balises la prochaine fois

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

Discussions similaires

  1. trigger sur une colonne
    Par _VAZ__ dans le forum Débuter
    Réponses: 1
    Dernier message: 07/03/2008, 11h19
  2. [SQL2000] Rédaction d'un trigger sur une colonne
    Par zooffy dans le forum Développement
    Réponses: 2
    Dernier message: 21/11/2007, 13h00
  3. Trigger sur Suppression de Colonne
    Par GSXRider dans le forum Oracle
    Réponses: 2
    Dernier message: 01/10/2007, 10h01
  4. TRIGGER sur des colonnes de la table
    Par hardmehdi dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/09/2007, 16h36
  5. Trigger sur une colonne ?
    Par hpalpha dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 22/03/2004, 14h16

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