2017-02-21 30 views
0

Я пытаюсь создать перед вставкой & триггер обновления на столе в Oracle. Пока я пытаюсь прочитать NEW.CLOB_COLUMN_VALUE, он дает мне пустое.Чтение CLOB перед вставкой, триггер обновления

Таблица:

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; 
/

Подскажите после попытки вставить:

ORA-20010: Testing Failed:[] 

Есть ли способ, мы можем прочитать :NEW.TEST_CLOB_VALUE, прежде чем вставить/обновить?

Требование состоит в том, чтобы проверить данные столбца CLOB перед вставкой/обновлением.

+0

Это, кажется, работает хорошо. - вставка A получает 'успешно [A]', вставка B получает [failed [B] '. Вы еще не указали инструкцию insert, которую вы использовали, - каково фактическое значение, которое вы пытаетесь вставить? –

+0

Я всегда использую rowid для добавления записей. Вставка запроса работает нормально. : выберите rowid, t1. * from Temp_Test101 t1 – pOrinG

+0

Спасибо за быстрый ответ и исправление. При добавлении с помощью rowid приглашение показывает empty []. Однако при использовании инструкции insert триггер работает правильно. – pOrinG

ответ

0

Поскольку его в clob колонке вам необходимо проверить состояние как

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

Смотрите демо:

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; 

Исполнение:

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

Кажется, что OP хочет сравнить всю ценность, а не только первый символ? Сравнение CLOB с CLOB работает, как и сравнение CLOB с строковым литералом до точки - до достижения лимита литерала строки 32k. –

+0

Я проверил его пример кода. Это не похоже, что он хочет сравнить весь клоб, и это невозможно. – XING

 Смежные вопросы

  • Нет связанных вопросов^_^