Oracle SQL 触发器
Oracle SQL Trigger
我刚开始编写 PL/SQL 触发器代码。
我有一个图书数据库,其中包含 [Title, Author, Score, Votes, Year] 列。
当我向数据库中插入一本新书时,我想将一本没有年份信息的书设置为 2014,并在标题末尾添加 _changed
。
CREATE OR REPLACE TRIGGER book_trigger
BEFORE INSERT ON BOOK
FOR EACH ROW
BEGIN
IF :NEW.YR IS NULL THEN :NEW.YR := 2014;
IF :NEW.YR IS NULL THEN :NEW.TITLE := :OLD.TITLE + '_changed'
END IF;
END IF;
END;
我的问题是标题没有添加 _changed
。
首先,您的第二个 if
条件永远不会是 TRUE
,因为您在前一行设置了 :NEW.YR
。其次,你的触发器在 BEFORE INSERT
上触发,: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;
注意 updating
标志,它由 oracle 预定义,它告诉我们行现在正在更新,而不是插入,我们只能在 UPDATING
模式下使用 :OLD
。
如果您真的想更改插入的记录以附加“_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;
/
根据@agent5566 的建议,您可以考虑不对插入执行此操作,而仅在更新时执行此操作。
我刚开始编写 PL/SQL 触发器代码。
我有一个图书数据库,其中包含 [Title, Author, Score, Votes, Year] 列。
当我向数据库中插入一本新书时,我想将一本没有年份信息的书设置为 2014,并在标题末尾添加 _changed
。
CREATE OR REPLACE TRIGGER book_trigger
BEFORE INSERT ON BOOK
FOR EACH ROW
BEGIN
IF :NEW.YR IS NULL THEN :NEW.YR := 2014;
IF :NEW.YR IS NULL THEN :NEW.TITLE := :OLD.TITLE + '_changed'
END IF;
END IF;
END;
我的问题是标题没有添加 _changed
。
首先,您的第二个 if
条件永远不会是 TRUE
,因为您在前一行设置了 :NEW.YR
。其次,你的触发器在 BEFORE INSERT
上触发,: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;
注意 updating
标志,它由 oracle 预定义,它告诉我们行现在正在更新,而不是插入,我们只能在 UPDATING
模式下使用 :OLD
。
如果您真的想更改插入的记录以附加“_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;
/
根据@agent5566 的建议,您可以考虑不对插入执行此操作,而仅在更新时执行此操作。