Oracle 填写更新栏(是否也创建?),以及为什么;对于每一行“;?
我有一个属于不同站点的人员表。这些网站可以改变,但不会经常改变。因此,当我们创建考勤记录(学习者会话对象)时,我们不会存储站点。但这在报告一个站点的培训时数方面造成了一个问题,因为一些人多年来改变了站点。不多,但我们想把这件事做好 因此,我在Oracle 填写更新栏(是否也创建?),以及为什么;对于每一行“;?,oracle,Oracle,我有一个属于不同站点的人员表。这些网站可以改变,但不会经常改变。因此,当我们创建考勤记录(学习者会话对象)时,我们不会存储站点。但这在报告一个站点的培训时数方面造成了一个问题,因为一些人多年来改变了站点。不多,但我们想把这件事做好 因此,我在learner\u session表中添加了一个site\u at\u the\u time列。我想用该人员参加会议时所在的站点自动填充此内容。但我不知道如何引用这个。出于某种原因(我猜是为了加快开发或其他原因),学习者id被允许为空。所以我现在计划做一个更
learner\u session
表中添加了一个site\u at\u the\u time
列。我想用该人员参加会议时所在的站点自动填充此内容。但我不知道如何引用这个。出于某种原因(我猜是为了加快开发或其他原因),学习者id被允许为空。所以我现在计划做一个更新触发器。学习者id不应该被更新,如果它以某种方式更新了,整个记录都将是垃圾,所以我不担心它会被覆盖
我现在的扳机是
create trigger set_site_at_the_time
after update of learner_id on lrn_session
begin
:new.site_at_the_time:= (select site_id from learner who where :new.learner_id = who.learner_id);
end;
这导致了以下错误:
ORA-04082: NEW or OLD references not allowed in table level triggers
现在,我做了一些研究,发现我需要对每一行使用,我想知道这对每一行的作用是什么,是触发器捕获的每一行吗?或者是表中的每一行?
另外,当我创建一个记录时也会触发吗?因此,如果我将插入学习者会话(id,学习者id,…)值(学习者会话id,1234,…)
这会恰当地捕捉到这一点吗
当我在这里的时候,我想看看这个触发器是否还有什么地方出了问题。但我主要是想弄清楚FOR每行应该做什么,以及它是否正确触发 对于每一行
意味着触发器将为SQL语句更新的每一行触发一次。如果没有这个子句,触发器将只触发一次,不管有多少行受到影响。如果要在插入值时更改它们,则必须对每行使用,否则触发器无法知道要使用哪个:新的和:旧的值
如前所述,触发器仅在更新时触发。要使其在插入时也激发,您需要更改定义:
CREATE TRIGGER set_site_at_the_time
BEFORE INSERT OR UPDATE OF learner_id
ON lrn_session
FOR EACH ROW
BEGIN
SELECT site_id into :new.site_at_the_time
FROM learner who
WHERE :new.learner_id = who.learner_id);
END set_site_at_the_time;
这是一个疏忽。代码示例旨在说明将UPDATE
更改为INSERT或UPDATE
的必要性。我必须在之前将其设置为,而不是在之后设置为,并且我必须使用声明当前站点编号(19)
和将站点id从…
选择到当前站点以使其工作。但这回答了我真正遇到的两个问题:每一行的是什么
,我的触发器是否会真正触发,这两个问题都得到了回答。我很感激,并填写了更多的代码块骨架!多谢各位!