Précédent   Forum des professionnels en informatique > Bases de données > Oracle
Oracle Forum Oracle : le serveur, les outils, ... Voir F.A.Q Oracle Tutoriels Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/12/2007, 10h17   #1
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
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 :

Citation:
[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
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 10h23   #2
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
ça ressemble étrangement à ceci : http://www.developpez.net/forums/sho...dbms_lob.Write
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 11h28   #3
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
Normal, c'est un collegue !!
Désolé : (
Je teste la solution donnée

Merci
jeeps64
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 11h54   #4
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
J'ai modifié le :
en
Code :
AND  DBMS_LOB.INSTR(body,'toto') > 0
j'ai toujours le message :
Citation:
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
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 13h05   #5
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
Voici un test simple que je fais et qui montre mon probleme

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
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
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 14h20   #6
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Apparemment tu as oublié de lire ceci : http://www.developpez.net/forums/d28716/bases-donnees/oracle/regles-infos-lire-poster/
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 14h23   #7
Expert Confirmé
 
Inscription : février 2006
Messages : 3 433
Détails du profil
Informations forums :
Inscription : février 2006
Messages : 3 433
Points : 3 462
Points : 3 462
Je n'arrive pas à reproduire votre problème avec 10.2.0.2.
Vous pouvez aussi essayer de mettre NULL dans la colonne.

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
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
__________________
P. Forstmann

AskTom Forums OTN doc 8, 9, 10 et 11
pifor est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 15h49   #8
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
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
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 15h55   #9
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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 ?
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 16h20   #10
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
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
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 16h29   #11
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
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
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 16h35   #12
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
OK

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


jeeps64
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 17h02   #13
Rédacteur/Modérateur
 
Avatar de orafrance
 
Inscription : janvier 2004
Messages : 15 861
Détails du profil
Informations personnelles :
Âge : 35

Informations forums :
Inscription : janvier 2004
Messages : 15 861
Points : 16 212
Points : 16 212
Apparemment c'est une limitation de la 9i

Code :
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 :
Citation:
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 :
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;
/
orafrance est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2007, 17h23   #14
Nouveau Membre du Club
 
Jean-Philippe SARASY
Inscription : mars 2007
Messages : 131
Détails du profil
Informations personnelles :
Nom : Jean-Philippe SARASY

Informations forums :
Inscription : mars 2007
Messages : 131
Points : 38
Points : 38
Cool, je vais tester cette alternative
Merci encore

jeeps64

nb: je vais faire attention aux balises la prochaine fois
jeeps64 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 07h13.


 
 
 
 
Partenaires

Hébergement Web