oracle 正在创建在插入时引发异常的触发器

h79rfbju  于 2023-04-20  发布在  Oracle
关注(0)|答案(1)|浏览(137)

我有几个寒假的大学任务,其中之一是在table上创建触发器:

PERSON(ID, Name, Surname, Age);

触发器应该在用户插入了具有无效ID的行时通知用户。有效性标准是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只存在于SQL Server中,而不是Oracle中。
我能做些什么来弥补呢?

ar5n3qh5

ar5n3qh51#

你想引发一个异常(这将阻止插入成功)吗?或者你想允许插入成功并向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;

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

相关问题