Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Oracle SQL触发器_Oracle_Plsql - Fatal编程技术网

Oracle SQL触发器

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

我不熟悉编写PL/SQL代码来执行触发器

我有一个图书数据库,其中有列[标题、作者、分数、投票、年份]

当我在数据库中插入新书时,我想将一本没有年份信息的书设置为2014年,并在标题末尾添加
\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)