2016-11-15 44 views
1

我想了解觸發器是如何工作的以及如何在給定的練習中正確編寫它們。我正在使用SQL Developer與4.2版本的Oracle。觸發Oracle運算符LIKE尊重字符串格式

我有一個表人員與這些領域:'matricule','pmatricule'和'typpers'。

'typpers'是一封顯示該人是學生(E),教授(P)還是其他人(X)的信。 'matricule'是一個3到7個數字的鏈,'matricule'是一個鏈'p',後面跟着一個3到6個數字的鏈。例如:'p145','p123456'。

我想讓我的觸發器檢查'matricule'或'pmatricule'的格式是否有人想要在表PERSON中插入一行時。

CREATE OR REPLACE TRIGGER new_matricule 
    BEFORE INSERT ON PERSONNE 
    FOR EACH ROW 

DECLARE 
    new_pmatricule PERSONNE.pmatricule%type; 
BEGIN 
    IF((:NEW.TYPPERS = 'P' OR :NEW.TYPPERS = 'X') AND :NEW.pmatricule NOT LIKE 'p%______') THEN 
    RAISE_APPLICATION_ERROR(-20100, 'pmatricule format is not good'); 
    END IF; 
END; 

我的觸發作品,如果我想要插入像「52P」 A「pmatricule」的格式,但它也激活時,我想,如「P145」插入。

我認爲我的語法不夠好,但我找不到適當的語法來做到這一點。

有沒有人有想法?

回答

1

首先,使用in簡化表達式第一部分的語法。然後,如果要計算字符數,請忽略'%'。類似這樣的:

IF((:NEW.TYPPERS IN ('P', 'X') AND :NEW.pmatricule NOT LIKE 'p______') THEN 
    RAISE_APPLICATION_ERROR(-20100, 'pmatricule format is not good'); 
    END IF; 

這就是說,「p」後面必須跟着六個字符。您的版本顯示「至少6個字符」。

如果你想兩個字符,然後AP,這將是:

:NEW.pmatricule NOT LIKE '__p' 

的任何數字,後一個「P」將是:

:NEW.pmatricule NOT LIKE '%p' 

如果你想要更高級的模式匹配,你可能想要使用regexp_like()。它更通用。

編輯:

基於您的評論,你想:

where regexp_like(:NEW.pmatricule, '^p[0-9]{3,6}$') 

這可能是寫的條件最簡單的方法。

如果你的意思是3-6 字符,你可以使用繁瑣:

where :NEW.pmatricule like 'p___' or 
     :NEW.pmatricule like 'p____' or 
     :NEW.pmatricule like 'p_____' or 
     :NEW.pmatricule like 'p______' 
+0

謝謝您的回答,我看到我的錯,但我想要寫的「P」,然後在最少3個數字和最多6個數字。 對於這種情況,沒有'簡單'語法(沒有使用regex_like())嗎? –

+0

是的,這就是我想到的原因,但它很醜陋。但是你確定'_'只能被數字取代嗎?因爲你說'人物',角色可以是字母或數字。 (抱歉的雙後,但我不能編輯我的第一個答案) –

+0

@MbrMbr。 。 。 '_'可以代替*任何*字符。我認爲答案在這一點上是明確的。 –