2017-02-21 78 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