PLSQL 触发器在插入后更新记录

Posted

技术标签:

【中文标题】PLSQL 触发器在插入后更新记录【英文标题】:PLSQL trigger to update a record after insert 【发布时间】:2015-10-24 13:48:30 【问题描述】:

我正在尝试创建一个数据库触发器,如果​​类(输入的记录)在之前上午 9 点或下午 6 点之后。

我希望此触发器影响的表称为:

TUTPRAC:CLASSID (PK)、UNITCODE、STAFFNO、CLASSDAY、CLASSTIME、CLASSTYPE、ROOMNUM

我不确定我是否走在正确的轨道上,我的代码到目前为止:

 CREATE TRIGGER CheckBeforeAfterHours
AFTER INSERT OR UPDATE OF CLASS_TIME ON TUTPRAC
FOR EACH ROW
BEGIN
  IF (:NEW.CLASS_TIME < 9:00 AND > 18:00) THEN
    UPDATE TUTPRAC SET STAFFNO = NULL, CLASS_DAY = NULL, CLASS_TYPE = NULL, ROOMNUM = NULL WHERE CLASS_TIME < 9:00 AND > 18:00;
  END IF;
END CheckBeforeAfterHours;

【问题讨论】:

@CM25 - 正如 OldProgrammer 评论的那样,pl/sql 是 Oracle 数据库对 SQL 的过程扩展。或者您真的使用 Oracle 数据库或 mysql?请正确地重新标记您的问题。 对不起,我的错误,我正在使用 oracle SQLDeveloper。 @Mureinik 【参考方案1】:

当您想要更新正在插入/更新的记录时,您可以使用 before 触发器:

CREATE TRIGGER CheckBeforeAfterHours
BEFORE INSERT OR UPDATE OF CLASS_TIME ON TUTPRAC
FOR EACH ROW
BEGIN
  IF (:NEW.CLASS_TIME < '09:00' AND > '18:00') THEN
     :NEW.STAFFNO := NULL;
     :NEW.CLASS_DAY := NULL;
     :NEW.CLASS_TYPE := NULL;
     :NEW.ROOMNUM := NULL;
  END IF;
END CheckBeforeAfterHours;

但是,我认为最好为上课时间简单地添加一个约束到表中,这样当您尝试插入或更改为无效时间时会出错。

【讨论】:

哦,我明白了,谢谢@Gordon Linoff。当我尝试使用此代码时,尽管出现编译器错误:Error(2,26): PLS-00103: Encountered the symbol "" when expecting one of the following: ) , * &amp; - + / at mod remainder rem &lt;an exponent (**)&gt; and or as || multiset Error(2,26): PLS-00049: bad bind variable '00' @cm25 。 . .您对class_time 的比较应该适合您使用的类型。我认为这是您问题中的伪代码,并且只是使用了该逻辑。请注意,如果您将这些作为字符串,那么它们需要采用“HH:MM”的格式,小时前带有前导零。 对不起,愚蠢的错误代表我。我已将 CLASS_TIME 设置为 varchar (5),我是否应该将其存储为 TIME 以检查时间是 18:00 ? @cm25 。 . . Oracle 是否有 time 数据类型? 将 class_time 字段设置为 varchar 我收到错误 Error(2,36): PLS-00103: Encountered the symbol "&gt;" when expecting one of the following: ( - + case mod new not null &lt;an identifier&gt; &lt;a double-quoted delimited-identifier&gt; &lt;a bind variable&gt; continue avg count current exists max min prior sql stddev sum variance execute forall merge time timestamp interval date &lt;a string literal with character set specification&gt; &lt;a number&gt; &lt;a single-quoted SQL string&gt; pipe &lt;an alternatively-quoted string literal with character set specification&gt; &lt;an alternatively

以上是关于PLSQL 触发器在插入后更新记录的主要内容,如果未能解决你的问题,请参考以下文章

PLSQL 触发器 - 基于选择查询更新记录

在 Microsoft SQL Server 上插入触发器后 -- 更新新创建记录中的列

插入后PostgreSQL触发函数更新

如何在 phpmyadmin 中创建触发器,插入后将更新花药表中的字段?

PLSQL 触发器:插入前

基于时间plsql的触发器