2016-11-15 24 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。 。 。 '_'可以代替*任何*字符。我认为答案在这一点上是明确的。 –