【问题标题】:'ORA-00934: group function is not allowed here' while creating a Procedure'ORA-00934: group function is not allowed here' 在创建过程时
【发布时间】:2021-02-04 04:01:27
【问题描述】:

我创建了一个存储过程,我希望将也是一个触发器的总计列添加到 FinalTotal。 代码:

程序FINAL_TOTAL:

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 而不是 HAVING 那么,它仍然给我同样的错误。

触发Total:

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

Products;

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: group function is not allowed here.

由于我是初学者,所以我没有那么多想法,所以如果有人知道为什么会发生这种情况,请告诉我!!

【问题讨论】:

  • 如果我写 WHERE 而不是 HAVING 那么它仍然给我同样的错误:显然,将 HAVING 用于 UPDATE 语句是不合适的,即使你想使用 WHERE ,然后需要删除那里的逗号,这是一个错字。顺便说一句,保留 TotalFinalTotal 值在设计上是不正确的,这些值可以在需要时从现有值中计算出来。
  • @BarbarosOzhan 如果您知道“设计此程序的正确方法是什么?”那么请让我知道,而且,在删除逗号后,我得到了同样的错误。所以请帮帮我!!

标签: oracle stored-procedures plsql


【解决方案1】:

请首先注意您的示例应该受到质疑。您通常不想customer Id 存储在Product 表中,因为您经常将一个product Id 出售给很多 客户。

因此,我在ProductSales 表上说明概念,同时仅保留最相关的属性。

我的主要观点是不要使用triggersprocedures,如果你只能使用纯SQL的话。

第一个概念是Total Price的计算——你可以使用virtual column来计算它

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 TABLE 中的公式定义。

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

因此,您可以从视图中获取 客户总数 值,而无需将其存储在表中(这将违反 normal forms

这是我最后的建议 - 获得一本介绍性 SQL 书籍,学习基本概念(例如规范化、ER 模型、Oracle 中的 CamelCase 标识符、price 并不总是 Int 数据类型等),然后开始你的职业生涯.

【讨论】:

    猜你喜欢
    • 2019-07-03
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多