2017-02-21 80 views
0

我試圖在Oracle中的表上插入&更新觸發器。 正在嘗試閱讀NEW.CLOB_COLUMN_VALUE時,它給我空白。在插入之前讀取CLOB,更新觸發器

表:

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

觸發:

ORA-20010: Testing Failed:[] 

有什麼辦法,我們可以讀出:NEW.TEST_CLOB_VALUE前插入/更新:試圖插入後

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

提示?

要求是在插入/更新之前驗證CLOB列的數據。

+0

這似乎很好地工作。 - 插入A獲得'成功[A]',插入B獲得[失敗[B]')。您沒有顯示您使用的插入語句 - 您嘗試插入的實際值是多少? –

+0

我總是使用rowid來添加記錄。插入查詢工作得很好。 :從Temp_Test101選擇rowid,t1。* t1 – pOrinG

+0

感謝您的快速回復和更正。使用rowid添加時,提示符顯示爲空[]。但是,當使用插入語句時,觸發器正常工作。 – 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

我檢查了他的示例代碼。它看起來並不像他想比較整個clob,那也不可能。 – XING