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 中。
你建议我能做些什么来解决这个问题?
提前致谢!
是否要引发异常(这会阻止插入成功)?或者您是否希望允许插入成功并将一个字符串写入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)
当然,在现实中,你永远不会为这种事情使用触发器。在现实世界中,您将使用约束。
| 归档时间: |
|
| 查看次数: |
27380 次 |
| 最近记录: |