2017-02-21 11 views
0

Oracleの表に挿入前に&更新トリガーを作成しようとしています。 NEW.CLOB_COLUMN_VALUEを読み込もうとしていますが、空白になっています。挿入の前にCLOBを読み込み、トリガーを更新します

表:

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

トリガー:

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を挿入すると[失敗[B] 'になります。あなたは使用した挿入ステートメントを表示していません - 挿入しようとしている実際の値は何ですか? –

+0

私は常にレコードを追加するためにROWIDを使用します..挿入クエリはうまく動作します。 :select rowid、t1。* Temp_Test101からt1 – pOrinG

+0

迅速な返信と修正をありがとう。 ROWIDを使用して追加すると、プロンプトに空の[]が表示されます。しかし、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と文字リテラルをポイントまで比較する場合と同様に、文字列リテラルの上限に達するまで有効です。 –

+0

サンプルコードを確認しました。それは彼が全体のclobとそれも可能ではないことを比較したいと思うように見えません。 – XING

関連する問題