2012-05-31 45 views
0

我有這樣一個觸發器,它驗證一個字段爲空:觸發器的if else

create or replace trigger trig1 
after insert on table_1 
for each row 
begin 
if ((select table2.column2 from table2 where table2.id= :new.id) isnull) then 
update table2 set table2.column2 = :new.column1 where table2.id = :new.id; 
end if; 
end trig1; 
. 
run; 

我得到的是不正確創建觸發器錯誤。我不知道問題是什麼。我使用Oracle SQL * Plus 10.2.0

+2

你能給我們錯誤代碼/ messsage? – Timst

+0

對於我的觸發器沒有錯誤消息,它只是表示觸發器是由編譯錯誤創建的。 –

回答

7

PL/SQL語法不允許在IF子句中包含SQL語句。

正確的方法是分離出SELECT語句,然後測試其結果。因此,這將是:

create or replace trigger trig1 
after insert on table_1 
for each row 
declare 
    v table2.column2%type; 
begin 
    select table2.column2 
    into v 
    from table2 
    where table2.id= :new.id; 

    if v is null 
    then 
     update table2 
     set table2.column2 = :new.column1 
     where table2.id = :new.id; 
    end if; 
end trig1; 

注意,這不處理多行的存在,在table2符合標準,或者實際上那裏是沒有匹配的行。它也不處理鎖定。

另外,請記住,像這樣的代碼在多用戶環境中運行不正常。這就是我提到鎖定的原因。你應該真的使用程序邏輯來處理這些需求。雖然通常情況不妙,觸發器設計不當,但真正的罪魁禍首是一個糟糕的數據模型。 table2.column2應該已經歸一化。

+0

它不工作 - 它告訴我「觸發器沒有正確創建」錯誤行4. –

+0

我們不是心靈感應。你需要給我們的細節。運行SQL * PLus命令'show error'或者使用這個查詢:'select * from user_errors'。 – APC

+0

查看錯誤是一個很好的理念,但這些命令表示沒有錯誤。我不知道爲什麼。當我嘗試運行觸發器時,它顯示錯誤:「ORA-04079」指向「v table2.column2%類型;」第4行。這就是全部。 –