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: ) , * & - + / at mod remainder rem <an exponent (**)> 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 ">" when expecting one of the following: ( - + case mod new not null <an identifier> <a double-quoted delimited-identifier> <a bind variable> continue avg count current exists max min prior sql stddev sum variance execute forall merge time timestamp interval date <a string literal with character set specification> <a number> <a single-quoted SQL string> pipe <an alternatively-quoted string literal with character set specification> <an alternatively
以上是关于PLSQL 触发器在插入后更新记录的主要内容,如果未能解决你的问题,请参考以下文章
在 Microsoft SQL Server 上插入触发器后 -- 更新新创建记录中的列