【问题标题】:Trigger Oracle operator LIKE to respect a string format触发 Oracle 运算符 LIKE 以尊重字符串格式
【发布时间】:2016-11-15 00:17:24
【问题描述】:

我正在尝试了解触发器的工作原理以及如何在给定的练习中正确编写它们。我正在使用带有 4.2 版 Oracle 的 SQL Developer。

我有一个表 PERSON,其中包含以下字段:'matricule'、'pmatricule' 和 'typpers'。

'typpers' 是一个字母,用于显示此人是学生 (E)、教授 (P) 还是其他 (X)。 'matricule' 是由 3 到 7 个数字组成的链,而 'matricule' 是一个由 'p' 后跟 3 到 6 个数字的链。示例:“p145”、“p123456”。

当有人想在 PERSON 表中插入一行时,我希望我的触发器检查“matricule”或“pmatricule”的格式是否受到尊重。

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”这样的“pmatricule”格式,我的触发器会起作用,但当我尝试插入像“p145”这样的格式时它也会激活。

我认为我的语法不够好,但我没有找到合适的语法来做到这一点。

有人有想法吗?

【问题讨论】:

    标签: sql database oracle triggers


    【解决方案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______'
    

    【讨论】:

    • 感谢您的回答,我明白我的错,但我要写的是“p”,后跟至少 3 个数字,最多 6 个数字。在这种情况下是否没有“简单”的语法(不使用 regex_like())?
    • 是的,这就是我在考虑的原因,但它太丑了。但是你确定那个 '_' 只能用数字代替吗?因为您说“字符”,字符可以是字母或数字。 (很抱歉重复发布,但我无法编辑我的第一个答案)
    • @MbrMbr 。 . . _ 可以替换 any 字符。我认为在这一点上答案很明确。
    • 是的,我理解这一点,但例如“p___”可以替换为“p456”或“pabc”,因为“_”可以替换任何字符,对吗?我想说的是我只想要'p'之后的数字
    • @MbrMbr 。 . .这就是为什么我建议使用正则表达式。
    猜你喜欢
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 2018-02-28
    • 2012-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多