2016-04-17 134 views
0

我試圖檢查登錄被插入到employee表中是否以某種格式給出,即:第一個字母是嚴格給定的 - x,然後是5個字母和兩個數字=> xlogin00。檢查字符串是否包含某些字符

CREATE OR REPLACE TRIGGER check_login 
BEFORE INSERT OR UPDATE OF login ON employee 
FOR EACH ROW 
DECLARE 
    xlogin00 employee.login%TYPE; 
    prefix VARCHAR2(1); 
    name VARCHAR2(5); 
    number VARCHAR2(2); 
BEGIN 
xlogin00 := :new.login; 
prefix := substr(xlogin00,1,1); 
name := substr(xlogin00,2,5); 
number := substr(xlogin00,7,2); 
if(LENGTH(xlogin00) != 8) then 
    Raise_Application_Error (-20203, 'Error'); 
end if; 
if(prefix != 'x') then 
    Raise_Application_Error (-20204, 'Error'); 
end if; 
if NOT REGEXP_LIKE(name, '[^a-z]') then 
    Raise_Application_Error (-20204, 'Error'); 
end if; 
if NOT REGEXP_LIKE(number, '[^0-9]') then 
    Raise_Application_Error (-20204, 'Error'); 
end if; 
END; 

似乎在我的代碼中工作的唯一東西是if(prefix != 'x')。其他的東西根本不起作用。我究竟做錯了什麼?

+0

請解釋正確的格式是什麼,以正確和不正確的值的例子。 –

+0

哪個RDBMS是爲了這個?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –

回答

2

你可以做到這一切與一個檢查:

IF NOT REGEXP_LIKE(:new.login, '^x[a-z]{5}\d\d$') THEN 
    Raise_Application_Error (-20204, 'Error'); 

請注意,您還你的布爾邏輯顛倒:在這兩個最後的測試,你必須在正則表達式的IF[^...]一個雙重否定(NOT )。

請注意,在建議的正則表達式中,需要^$以確保匹配是完整的登錄值,而不僅僅是一個子字符串。

+0

如果您還需要允許大寫,則使用REGEXP_LIKE(...,'i')(帶有第三個參數,表示不區分大小寫的patern匹配)。如果相反,第一個字母必須是小寫字母x,但其他字母可以是大寫或小寫字母,那麼在匹配模式本身,戈登有[a-z]的地方,可以寫成[a-zA-Z]。 – mathguy

相關問題