Oracle 创建一个触发器来更新值
我有这两张桌子Oracle 创建一个触发器来更新值,oracle,plsql,database-trigger,Oracle,Plsql,Database Trigger,我有这两张桌子 项目(项目、文章) 物品(prodID,ArticleID) 我如何创建一个触发器,在每次有人发表文章时将文章总量更新1 CREATE TRIGGER Art_Up AFTER INSERT ON Article FOR EACH ROW UPDATE Project SET TotArticle = TotArticle + 1 WHERE paperID = NEW.PaperID; 然而,它给了我这个错误PLS-00103:遇到了符号“;”你弄
- 项目(项目、文章)
- 物品(prodID,ArticleID)
CREATE TRIGGER Art_Up
AFTER INSERT ON Article
FOR EACH ROW
UPDATE Project
SET TotArticle = TotArticle + 1
WHERE paperID = NEW.PaperID;
然而,它给了我这个错误PLS-00103:遇到了符号“;”你弄乱了一些名字,一旦你写了
projID
,一旦prodID
,在你的触发器中它就是paperID
。触发器也没有begin
<代码>结束代码>。而且,您没有处理在表project
中不存在projID
的地方添加文章。您可以先检查它,或者在更新后使用行数
,如果它是0,则使用插入
。更简单的是使用merge
create or replace trigger art_up after insert on article for each row
begin
merge into project
using (select :new.projid projid from dual) src
on (project.projid = src.projid)
when matched then update set totarticles = totarticles + 1
when not matched then insert (projID, TotArticles) values (:new.projid, 1);
end;
它可以工作,我测试了一些基本插入,但根本不推荐使用,因为:
- 在触发器中保留逻辑是个坏主意
- 触发器可能会被删除、禁用,然后这些信息可能会误导、错误
- 我们正在放缓插入操作
- 此触发器不处理应减少文章总数的
delete
create or replace view vw_project as select projID, count(1) total from article group by projid;
什么是
paperID
?在您的表定义中,我没有看到名为PaperID
的列。Oracle PL/SQL引用没有。我建议您阅读它,因为它将有助于理解和修复这些简单的语法错误。oracle块必须具有最小的BEGIN
和END