Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.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_Plsql_Database Trigger - Fatal编程技术网

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)
我如何创建一个触发器,在每次有人发表文章时将文章总量更新1

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