大家好,祝大家新年快乐!
我几乎没有冬季休假的大学任务,其中一项是在桌子上创造扳机:
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中。
你会建议我做些什么来解决这个问题?
提前致谢!
答案 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;
当然,实际上,你永远不会使用触发器来做这类事情。在现实世界中,您将使用约束。