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

dev*_*Bem 3 sql oracle triggers plsql

各位程序员大家好,祝大家新年快乐!

我寒假的大学任务很少,其中之一是在桌子上创建触发器:

PERSON(ID, Name, Surname, Age);
Run Code Online (Sandbox Code Playgroud)

触发器应该在用户插入带有无效 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;
Run Code Online (Sandbox Code Playgroud)

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

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

提前致谢!

Jus*_*ave 8

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

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

CREATE OR REPLACE TRIGGER person_id_trigg
  AFTER INSERT
  ON person
  FOR EACH ROW
Run Code Online (Sandbox Code Playgroud)

如果你想引发异常

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

如果您想潜在地打印输出但允许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;
Run Code Online (Sandbox Code Playgroud)

当然,在现实中,你永远不会为这种事情使用触发器。在现实世界中,您将使用约束。