Oracle SQL触发器
我不熟悉编写PL/SQL代码来执行触发器 我有一个图书数据库,其中有列[标题、作者、分数、投票、年份] 当我在数据库中插入新书时,我想将一本没有年份信息的书设置为2014年,并在标题末尾添加Oracle SQL触发器,oracle,plsql,Oracle,Plsql,我不熟悉编写PL/SQL代码来执行触发器 我有一个图书数据库,其中有列[标题、作者、分数、投票、年份] 当我在数据库中插入新书时,我想将一本没有年份信息的书设置为2014年,并在标题末尾添加\u changed 创建或替换触发器手册\u触发器 在书上插入之前 每行 开始 如果:NEW.YR为空,则:NEW.YR:=2014; 如果:NEW.YR为空,则:NEW.TITLE:=:OLD.TITLE+“\u changed” 如果结束; 如果结束; 结束; 我的问题是标题没有添加\u change
\u changed
创建或替换触发器手册\u触发器
在书上插入之前
每行
开始
如果:NEW.YR为空,则:NEW.YR:=2014;
如果:NEW.YR为空,则:NEW.TITLE:=:OLD.TITLE+“\u changed”
如果结束;
如果结束;
结束;
我的问题是标题没有添加
\u changed
。首先,如果条件将永远不会为真,因为您在前面一行设置了:NEW.YR
。第二,你的触发器在插入之前在上触发,并且:OLD。TITLE
将始终为NULL
。我只能建议你想要这样的东西
CREATE OR REPLACE TRIGGER book_trigger
BEFORE INSERT or UPDATE ON BOOK
FOR EACH ROW
BEGIN
IF :NEW.YR IS NULL
THEN
:NEW.YR := 2014;
END IF;
if updating then
:NEW.TITLE := :OLD.TITLE || '_changed';
end if;
END;
注意更新
标志,它是oracle预定义的,它告诉我们行正在更新,而不是插入,我们只能在更新
模式下使用:OLD
。如果您确实想将插入的记录更改为附加“\u changed”,可以执行以下操作:
CREATE OR REPLACE TRIGGER book_trigger
BEFORE INSERT or UPDATE ON BOOK
FOR EACH ROW
BEGIN
IF :NEW.YR IS NULL
THEN
:NEW.YR := 2014;
:NEW.TITLE := :OLD.TITLE || '_changed';
end if;
END;
/
如@ AgTeNET5666所建议的,您可以考虑不为插入而这样做,只在UPDATE上执行它。
将您的+更改为“ω”(Oracle级联运算)我将其更改为如果:NEW.YR为空,那么:NEW.TITLE:=:OLD.TITLE | |"u changed'
,但这并没有添加\u changed
。您是否建议将代码更改为:如果:NEW.YR为空,那么:NEW.YR:=2014;如果结束;如果:NEW.YR为空,则:NEW.TITLE:=:NEW.TITLE | |'| u NEW';如果结束因为我已经试过了,我现在明白了为什么第二个if
语句永远都不会正确logic@Together_United如果我帮助过你,请接受答案;)我希望在插入记录时执行这两个事件,而不是更新。这就是我被困住的原因。如果:NEW.YEAR为空
变为真
你不能有一个“+”,我不知道如何使第二个。您将得到一个数值错误。谢谢!我没有意识到你可以在一个If-Then
中对触发器进行多个更改。在INSERT
@上同时使用:OLD.TITLE
。\u unite如果触发器仅用于INSERT,那么你可以设置:NEW.TITLE:='\u changed'(这很奇怪,但显然是必需的。但是由于触发器也是用于更新的,所以将:OLD.TITLE保留在其中是有意义的。我的意思是使用NEW.TITLE:=:NEW.TITLE | | |'_changed'
我想在insert上做所有事情,我在上面说过,但是我的代码是错误的@agent5566)