2013-03-20 36 views
1

我必須在Oracle數據庫上創建這個時髦的ON INSERT觸發器。在Oracle表上創建ON INSERT觸發器

我已經給出了這個舊的項目,缺少部分源代碼,所以現在我只能使用數據庫工作一些魔術。觸發器應該更新插入時的行,並從其他視圖中刪除值。

下面是一些由樣本數據:

我有這個表,讓我們把它叫做TABLE1。 然後我有這個看法,可以叫它VIEW2。 鑑於可能存在多個具有相同CODE的記錄,但它們是完全重複的,所以任何行都是有效的。這些副本只有少數幾個,但客戶還沒有過濾掉它們。

  • TABLE1VIEW1有以下字段(CODE, PARTNER, COUNTRY)
  • TABLE1也有字段COMMENT

所有字段都是varchar類型。

在該領域中是COMMENTvarchar類型的並具有添加到其價值,像這樣一個後綴: 「-XXX-CODE」,例如,「一些評論-XXX-123」。

這裏是我的scenarion:

這被插入TABLE1

**CODE;PARTNER;COUNTRY;COMMENT** 

- 123;TEST;USA;SOME COMMENT 
- 145;TEST2;GB;SOME COMMENT 
- NULL;NULL;NULL;SOME COMMENT-XXX-154 

這是觸發應該踢 - IF場CODE IS NULL,觸發shuld fire和 - 解析出基於-XXX-前綴的代碼(在此示例中取值154) - 在上查看選擇查看(select co德,尋找合作伙伴,從VIEW1國家,代碼= 154 - 如果找到記錄它應該code, partner and country

好更新TABLE1,我希望情況是清楚的。 由於我沒有經驗與甲骨文解決我的問題,非常感謝。

感謝。

回答

2

我不知道什麼是列代碼的類型,所以我猜想它是INTEGER。 給你

CREATE OR REPLACE TRIGGER tri_check_nulls 
    BEFORE INSERT ON TABLE1 
    FOR EACH ROW WHEN (new.CODE is NULL) 
DECLARE 
    VIEW_CODE INTEGER; 
BEGIN 

    VIEW_CODE := TO_NUMBER(SUBSTR(new.COMMENT, INSTR(new.COMMENT, '-', -1, 1) + 1)); 

    select distinct v.CODE, v.PARTNER, v.COUNTRY 
     into :new.CODE, :new.PARTNER, :new.COUNTRY 
     from VIEW1 v 
     where v.CODE = VIEW_CODE; 

END; 
/

當然,你必須添加一些錯誤處理。 請閱讀Oracle文檔CREATE TRIGGER

+0

該字段代碼是varchar類型。感謝這個例子。然而,我發現難以理解基於「-XXX-CODE」示例 – no9 2013-03-20 09:15:23

+0

的示例中的SUBSTR/INSTR函數,我已經測試了這些函數,現在它已經可以理解了。 – no9 2013-03-20 09:22:45

+0

我收到編譯錯誤:在PLS-00201:標識符'NEW.COMMENT'必須聲明。 – no9 2013-03-21 08:09:41