Oracle ';ORA-00934:此处不允许使用组函数';在创建过程时

Oracle ';ORA-00934:此处不允许使用组函数';在创建过程时,oracle,stored-procedures,plsql,Oracle,Stored Procedures,Plsql,我已经创建了一个存储过程,我希望将total列(也是一个触发器)添加到FinalTotal中。 代码: 程序最终\u总计: create procedure FINAL_TOTAL(C IN NUMBER,T OUT NUMBER) IS BEGIN UPDATE Products SET FinalTotal = SUM(Total), HAVING ProdCustId = C; Commit;

我已经创建了一个存储过程,我希望将total列(也是一个触发器)添加到FinalTotal中。 代码:

程序
最终\u总计

create procedure FINAL_TOTAL(C IN NUMBER,T OUT NUMBER)
        IS
        BEGIN
        UPDATE Products
        SET FinalTotal = SUM(Total),
        HAVING ProdCustId = C;
        Commit;
        SELECT SUM(FinalTotal) into T FROM Products WHERE ProdCustId = C;
        END;
        /
在这里,如果我写
WHERE
而不是
have
,它仍然会给我同样的错误

触发器
总计

CREATE TRIGGER PROD_TOTAL
    AFTER INSERT ON Products
    BEGIN
    UPDATE Products
    SET Total = ProdPrice * ProdQuantity;
    END;
    /
产品

create table Products
    ( ProdId number primary key,
      ProdNum number not null unique,
      ProdName varchar2(15),
      ProdPrice int,
      ProdQuantity int,
      Total int,
      FinalTotal int,
      ProdCustId int references Customers,
      ProdOrdId int references Orders,
      ProdStoreId int references Stores
    );
错误: 5/18 PL/SQL:ORA-00934:此处不允许使用组函数


因为我是一个初学者,我没有那么多的想法,所以如果有人知道为什么会发生这种情况,那么请让我知道

首先请注意,您的示例应该受到质疑。您通常不希望将
客户Id
存储在
产品
表中,因为您经常向许多客户销售一个
产品Id

因此,我将在
ProductSales
表中演示这些概念,同时只留下最相关的属性

我的主要观点是,如果只能使用普通SQL,则不要使用触发器过程

第一个概念是计算
总价
——您可以使用

create table ProductSales
    ( ProdId number primary key,
      ProdPrice int,
      ProdQuantity int,
      Total int generated always as (ProdPrice * ProdQuantity) virtual,
      ProdCustId int  
    );
    
insert into  ProductSales (ProdId, ProdPrice, ProdQuantity,ProdCustId) values (1, 100, 5, 1001);   
insert into  ProductSales (ProdId, ProdPrice, ProdQuantity,ProdCustId) values (2, 50,  1, 1001);
insert into  ProductSales (ProdId, ProdPrice, ProdQuantity,ProdCustId) values (3, 100, 10,1002);
添加您看到的一些示例数据后,
Total
列按预期计算,并使用
CREATE表中的公式定义

select * from ProductSales;

    PRODID  PRODPRICE PRODQUANTITY      TOTAL PRODCUSTID
---------- ---------- ------------ ---------- ----------
         1        100            5        500       1001
         2         50            1         50       1001
         3        100           10       1000       1002
下一个功能是计算每个客户的总价格。在这里,我建议在如下视图中使用分析函数

create view V_ProductSales as         
select a.*,
sum(TOTAL) over (partition by ProdCustId) as CustTotal
from  ProductSales a;

select * from V_ProductSales;

   PRODID  PRODPRICE PRODQUANTITY      TOTAL PRODCUSTID  CUSTTOTAL
---------- ---------- ------------ ---------- ---------- ----------
         1        100            5        500       1001        550
         2         50            1         50       1001        550
         3        100           10       1000       1002       1000
因此,您可以从视图中获取客户总价值,但不将其存储在表中(这将违反


这是我的最后一个建议-买一本介绍SQL的书,学习基本概念(如规范化、ER模型、Oracle中的CamelCase标识符,
price
并不总是
Int
datatype等),然后开始你的职业生涯。

如果我写WHERE而不是have,但它还是给了我同样的错误:显然,在UPDATE语句中使用HAVING是不合适的,即使您想使用WHERE,也需要删除那里的逗号,这是一个拼写错误。顺便说一句,在设计上不正确的做法是,在需要时保留可以从现有值中计算出来的
Total
FinalTotal
值。@BarbarosOzhan如果您知道“设计此过程的正确方法是什么?”请告诉我,并且在删除逗号后,我也会收到相同的错误。所以请帮帮我!!“相关”问题