创建在插入时抛出异常的触发器

时间:2014-01-02 21:55:19

标签: sql oracle plsql triggers

大家好,祝大家新年快乐!

我几乎没有冬季休假的大学任务,其中一项是在桌子上创造扳机:

PERSON(ID, Name, Surname, Age);

触发器应该在用户插入带有无效ID的行时通知用户。 Vadility标准是ID长度为11位。

我试着写这样的解决方案:

CREATE OR REPLACE TRIGGER person_id_trigg
AFTER INSERT
ON person
DECLARE
  idNew VARCHAR(50);
  lengthException EXCEPTION;
BEGIN
  SELECT id INTO idNew FROM INSERTED;
  IF LENGTH(idNew) <> 11 THEN
  RAISE lengthException;
  END IF;
  EXCEPTION
  WHEN lengthException THEN
  dbms_output.put_line('ID for new person is INVALID. It must be 11 digits long!'); 
END;

然后我意识到INSERTED只存在于sqlserver而不存在于oracle中。

你会建议我做些什么来解决这个问题?

提前致谢!

1 个答案:

答案 0 :(得分:3)

是否要引发异常(这会阻止插入成功)?或者您是否希望允许插入成功并将字符串写入dbms_output缓冲区,该缓冲区可能存在也可能不存在,并且可能会或可能不会向运行插入的人显示?

在任何一种情况下,您都希望这是一个行级触发器,而不是语句级触发器,因此您需要添加for each row子句。

CREATE OR REPLACE TRIGGER person_id_trigg
  AFTER INSERT
  ON person
  FOR EACH ROW

如果你想引发异常

BEGIN
  IF( length( :new.id ) <> 11 )
  THEN
    RAISE_APPLICATION_ERROR( -20001, 
                             'The new ID value must have a length of 11' );
  END IF;
END;

如果您想要打印输出但允许insert成功

BEGIN
  IF( length( :new.id ) <> 11 )
  THEN
    dbms_output.put_line( 'The new ID value must have a length of 11' );
  END IF;
END;

当然,实际上,你永远不会使用触发器来做这类事情。在现实世界中,您将使用约束。