Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/470.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 填写更新栏(是否也创建?),以及为什么;对于每一行“;?_Oracle - Fatal编程技术网

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从…
选择到当前站点以使其工作。但这回答了我真正遇到的两个问题:每一行的
是什么
,我的触发器是否会真正触发,这两个问题都得到了回答。我很感激,并填写了更多的代码块骨架!多谢各位!