我试图了解触发器的工作方式以及如何使用给定的练习正确编写它们。我使用SQL Developper和Oracle的4.2版本。
我有一个PERSON表格,包含以下字段:' 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;
如果我试图插入一个' pmatricule'我的触发器有效。格式如' 52p'但是当我尝试插入诸如' p145'时,它也会激活。
我认为我的语法不够好但我找不到合适的语法。
有人有想法吗?
答案 0 :(得分: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个字符”。
如果你想要两个字符后跟一个p,那就是:
: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______'