2017-04-12 24 views
0

我的問題是因爲我是新的與oracle和pl/sql可以檢查插入期間通過使用自我構造函數的值。 根據另一個屬性值檢查變量項目的數量的示例?Oracle自身構造函數與if語句

Create or Replace Type test_arr as Varray(20) of number; 

Create or Replace Type test_typ as Object(
tID number(5), 
tType varchar2(1), 
tArray test_arr 
); 

我想測試時TTYPE =「A」然後tArray.count應小於2,並且如果所述TTYPE =「B」,那麼tArray.count應在5和20之間 我想在插入過程中測試如下:

Create Table test_tbl of test_typ; 
Insert Into test_tbl Values(187,'A',test_arr(1,6,7)); /*This should give an error and not insert the record as the tType is 'A' and the tArray has 3 values!*/ 

我不知道我是否可以用自我回報做到這一點。這裏最主要的是我需要在插入過程中檢查!

我會適當的任何幫助。謝謝!

+0

一個類型構造函數在這裏沒有幫助。首先,你只能添加構造函數,而不能改變默認構造函數,所以你的自定義驗證構造函數必須具有除'(tID,tType,tArray)'以外的簽名。其次,在對象表的關係表示中插入「insert」不會調用其類型的構造函數。 –

回答

2

這可以通過觸發

create trigger instrg BEFORE INSERT ON test_tbl 
FOR EACH ROW 
BEGIN 
    IF :NEW.tType = 'A' AND :NEW.tArray.COUNT >= 2 then 
     RAISE_APPLICATION_ERROR(-20001, 'error 1'); 
    ELSIF :NEW.tType = 'B' AND :NEW.tArray.COUNT NOT BETWEEN 5 AND 20 then 
     RAISE_APPLICATION_ERROR(-20001, 'error 2'); 
    END IF; 
END; 

if else條件下進行,我想你很容易地理解什麼條件都沒有,你還可以修改他們,如果你需要。

+0

是的,我知道,如果條件。我使用過程完成了任務,並使用聲明開始call_procedure()結束的東西調用它,但我只需要在sql中使用它。其實我不知道這個觸發器的事情,所以我會看看這個。 tnx – bontoo

+0

我試過觸發器。正是我需要的。它與其他限制完美地結合在一起,我放在那裏。非常感謝! – bontoo

+0

@bontoo - 不客氣 –