检查字符串是否包含某些字符

时间:2016-04-17 11:57:55

标签: sql regex oracle oracle12c

我正在尝试检查插入到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')。其他东西根本不起作用。我做错了什么?

1 个答案:

答案 0 :(得分:2)

您可以通过一次检查完成所有这些操作:

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

请注意,您的布尔逻辑也已反转:在最后两次测试中,您都有双重否定(NOT中的IF和正则表达式中的[^...]

请注意,在提议的正则表达式中,需要^$来确保匹配是完整的登录值,而不仅仅是子字符串。