2017-02-21 1 views
0

Je suis en train de créer un déclencheur de mise à jour & avant d'insérer sur une table dans Oracle. Pendant que j'essaie de lire le NEW.CLOB_COLUMN_VALUE, il me donne un espace vide.Lecture CLOB dans avant l'insertion, déclencheur de mise à jour

Tableau:

CREATE TABLE TEMP_TEST101 
(
    ID    NUMBER(2), 
    TEST_CLOB_VALUE CLOB 
) 

Trigger:

CREATE OR REPLACE TRIGGER TR_Temp_Test101 
BEFORE INSERT OR UPDATE 
ON Temp_Test101 FOR EACH ROW 
DECLARE 
BEGIN 

If (:NEW.TEST_CLOB_VALUE = 'A') 
Then 
    raise_application_error(-20010,'Testing Successfull'); 
End IF; 

raise_application_error(-20010,'Testing Failed:['||:NEW.TEST_CLOB_VALUE||']'); 


END TR_Temp_Test101; 
/

rapide après avoir essayé d'insérer:

ORA-20010: Testing Failed:[] 

Est-il possible que nous pouvons lire le :NEW.TEST_CLOB_VALUE avant insertion/mise à jour?

L'exigence est de valider les données de la colonne CLOB avant insertion/mise à jour.

+0

Cela semble fonctionner très bien. - insérer un A réussit [A] ', insérer B obtient [échec [B]'. Vous n'avez pas montré l'instruction d'insertion que vous avez utilisée, quelle est la valeur réelle que vous essayez d'insérer? –

+0

J'utilise toujours rowid pour ajouter des enregistrements. La requête d'insertion fonctionne très bien. : sélectionnez rowid, t1. * from Temp_Test101 t1 – pOrinG

+0

Merci pour la réponse rapide et la correction. Lors de l'ajout à l'aide de rowid, l'invite affiche vide []. Toutefois, lors de l'utilisation de l'instruction insert, le déclencheur fonctionne correctement. – pOrinG

Répondre

0

Depuis sa colonne clob vous devez vérifier la condition que

dbms_lob.substr(:NEW.TEST_CLOB_VALUE,1,1) = 'A' 

Voir la démo:

CREATE OR REPLACE TRIGGER TR_Temp_Test101 
    BEFORE INSERT OR UPDATE 
    ON Temp_Test101 
    FOR EACH ROW 
DECLARE 
BEGIN 
    IF (dbms_lob.substr(:NEW.TEST_CLOB_VALUE,1,1) = 'A') 
    THEN 
     raise_application_error (-20010, 'Testing Successfull'); 
    END IF; 

    raise_application_error (
     -20010, 
     'Testing Failed:[' || :NEW.TEST_CLOB_VALUE || ']'); 
END TR_Temp_Test101; 

Exécution:

SQL> Insert into TEMP_TEST101 values(1,'A'); 
Insert into TEMP_TEST101 values(1,'A') 
      * 
ERROR at line 1: 
ORA-20010: Testing Successfull 
ORA-06512: at "TR_TEMP_TEST101", line 5 
ORA-04088: error during execution of trigger 'TR_TEMP_TEST101' 
+0

L'OP semble vouloir comparer la valeur entière, pas seulement le premier caractère? La comparaison d'un CLOB avec un CLOB fonctionne, tout comme la comparaison d'un CLOB avec un littéral de chaîne jusqu'à un point - jusqu'à ce que la limite littérale de chaîne de 32k soit atteinte. –

+0

J'ai vérifié son code d'exemple. Il ne semble pas qu'il veuille comparer tout le clob et ce n'est pas possible aussi bien. – XING