ORACLE SQL触发器和总和()

ORACLE SQL触发器和总和(),sql,oracle,plsql,Sql,Oracle,Plsql,我有一个表格命令和一个表格重组。我有这个功能: CREATE OR REPLACE PROCEDURE multiplicateur(a NUMBER, taxes NUMBER, c OUT NUMBER) IS BEGIN c := a * taxes ; END multiplicateur; / 我正试图使用该函数触发一个触发器,用一个可以包含多个项目的命令中的taxes来更新总价。我尝试过这个,但它不想工作: create or replace TRIGGER MAJ_PRI

我有一个表格命令和一个表格重组。我有这个功能:

CREATE OR REPLACE PROCEDURE multiplicateur(a NUMBER, taxes NUMBER, c OUT NUMBER)
IS
BEGIN
    c := a * taxes ;
END multiplicateur;
/
我正试图使用该函数触发一个触发器,用一个可以包含多个项目的命令中的taxes来更新总价。我尝试过这个,但它不想工作:

create or replace TRIGGER MAJ_PRIX_COMMANDE
AFTER INSERT OR UPDATE OR DELETE ON REGROUPE
FOR EACH ROW
DECLARE 
resultat NUMBER; 
BEGIN
UPDATE COMMANDE
SET COMMANDE.prixTotal = multiplicateur((CAST((SELECT SUM(prixRegroupe)FROM REGROUPE WHERE REGROUPE.numCommande = :NEW.numCommande)AS NUMBER)),1.15,resultat)

WHERE COMMANDE.numCommande = :NEW.numCommande;
END;

有人能帮我吗?

这个怎么样?我从我的iPhone发送了这个;这段代码还没有经过测试

create or replace TRIGGER MAJ_PRIX_COMMANDE
AFTER INSERT OR UPDATE OR DELETE ON REGROUPE
FOR EACH ROW
DECLARE 
 resultat NUMBER; 
 l_groupe NUMBER; --will store sum based on numCommande
BEGIN
 --retrieve sum of prixRegroupe
 SELECT SUM(r.prixRegroupe)
   INTO l_groupe
   FROM regroupe r
  WHERE r.numCommande = :NEW.numCommande;

  --call procedure and pass the sum of priRegroupe
  multiplicateur(l_groupe, 1.15, resultat);

  --use precedures out argument to update commande
 UPDATE COMMANDE c
    SET c.prixTotal = resultat
  WHERE c.numCommande = :NEW.numCommande;
END;
这个代码不起作用。这将导致一个突变的触发错误。在触发器中,只有在触发器完成执行后,才能查询或修改触发器所基于的同一个表

ORA-04091:表名正在变化,触发器/函数可能看不到它

现在的问题是,当触发器尝试插入/更新同一个表时,您正在查询重组表。这是不可能做到的


您需要找到一种方法以其他方式获得prixRegroupColumn的和。如果我想明天回复,那就太晚了。

如果你想在查询中使用该值,你需要创建一个函数。你是说,一个不是我已经得到的函数?我不确定我understand@XavierSavage-您当前有一个过程,而不是一个函数。您可以先调用该过程,然后在更新中使用
resultat
。但是,有一个单独的程序/函数来进行简单的计算真的值得吗?“你确定触发器是正确的机制吗?”阿列克斯普尔,我知道这是一个简单的计算,但这是一个家庭作业,我需要使用一个程序。但是如果我把我的程序放在开始和更新之间,它也不起作用。我和Alex在一起,我认为这里有更好的解决方案。尽管这是一个家庭作业,但这似乎是一个糟糕的做法。如果您有11g或新数据库,我建议使用虚拟列。谢谢它是有效的,但是当我尝试在ReGype中插入一些东西时,我得到了这样的结论:*原因:一个触发器(或者在这个语句中引用的用户定义的PLSQL函数)试图查看(或修改)一个表,该表在被它激发的语句修改的中间。*动作:重写触发器(或函数)我不知道为什么,我只更新了命令Table@XavierSavage你能发布完整的错误信息吗?另外,您是说只有在插入时才会收到此错误吗?触发器可以在更新和删除时正常工作?在下面对我的question@XavierSavage我在回答中添加了评论。不幸的是,我无法提供更好的答案。也许其他人可以。我知道这是一个家庭作业,但在现实世界中,这被认为是糟糕的设计。