【发布时间】:2021-04-30 03:21:38
【问题描述】:
我正在开发我的项目“超市计费管理系统”,因为我是初学者,在制作项目时遇到了很多问题。在这里,我已经创建了一个触发器和一个过程,但我不知道如何执行它,我为单个产品的总价格创建了一个触发器,即ProdTotal = ProdPrice * ProdQuantity;。
这意味着每当用户在 Products 表中输入一些数据时,必须执行此触发器,但我不知道如何执行它,类似地,我创建了一个程序来计算购买的所有产品的总价格一个客户。就像您去超市或任何商店时,购买商品后,您会收到一张账单,并且有最终的总金额。我什至不确定我的程序代码是对还是错,虽然它创建成功,但我不确定它是否会给我想要的确切输出,所以如果你能帮助我,请告诉我,我从不同的网站和许多 youtube 视频中进行了很多研究,但严重的是我不知道如何解决它,所以请帮助我!
代码:
产品表
create table Products
( ProdId number primary key,
ProdNum number not null unique,
ProdName varchar2(15),
ProdPrice int,
ProdQuantity int,
ProdCustId int references Customers,
ProdOrdId int references Orders,
ProdStoreId int references Stores
);
付款表
create table Payments
( PayId int primary key,
PayDate date,
ProdTotal int,
FinalTotal int,
PayOrdId int references orders,
PayProdId int references Products,
PayCustId int references Customers
);
触发码
create trigger PROD_TOTAL
AFTER INSERT ON Products
BEGIN
UPDATE Payments
SET ProdTotal = (SELECT Products.ProdPrice * Products.ProdQuantity FROM Products);
END;
/
程序代码
create procedure FINAL_TOTAL(C IN NUMBER, T OUT NUMBER)
IS
BEGIN
UPDATE Payments
SET FinalTotal = FinalTotal + ProdTotal
WHERE PayCustId = C;
Commit;
SELECT FinalTotal into T FROM Payments WHERE PayCustId = C;
END;
/
在产品表中插入语句:
insert into Products values(1,1001,'Syrup',30,4,1,1,1);
在 Payments 表中插入语句:
insert into Payments(PayId, PayDate, PayOrdID, PayProdId, PayCustId)
values(1,date'2020-10-07',1,1,1);
输出:
select * from products;
PRODID PRODNUM PRODNAME PRODPRICE PRODQUANTITY PRODCUSTID
---------- ---------- --------------- ---------- ------------ ----------
PRODORDID PRODSTOREID
---------- -----------
1 1001 Syrup 30 4 1
1 1
select * from Payments;
PAYID PAYDATE PRODTOTAL FINALTOTAL PAYORDID PAYPRODID PAYCUSTID
---------- --------- ---------- ---------- ---------- ---------- ----------
1 07-OCT-20 1 1 1
现在在这里,您可以看到 PRODTOTAL 和 FINALTTOTAL 列是空白的,我知道为什么它是空白的,因为我没有输入任何值。我没有在这两列中输入任何值的原因是我想要,系统应该在触发器和过程的帮助下自动计算那个计算,我什至不能删除触发器和过程,因为它在我们的强制性项目使用这两个概念。所以请帮帮我!!!
【问题讨论】:
-
prod_total不应该在products表中吗?这使得触发器更简单,尽管实际上您可以使用虚拟列而不是触发器。似乎插入payments应该在过程中(而不是更新);然后您会调用该过程而不是手动插入?但目前尚不清楚您实际上被要求做什么。 -
是的,你是对的,我什至可以在 products 表中创建一个
prod_total列但是,我也想在我的Payments表中创建相同的列,所以有什么方法可以复制列的值从不同的表到另一个? -
试图存储一个可以在运行时计算的值是一个严重的设计缺陷。存储的值与计算的值不同只是时间问题。尝试在两个不同的地方存储相同的值也是如此。
-
@EdStevens 那么,你能告诉我任何解决方案吗
-
最佳解决方案需要对您的实体和数据元素进行彻底分析。所有表格都应设计为第三范式。从您的 PRODUCTS 表开始。产品的价格是可以变化的,所以不应该是 PRODUCTS 的固定属性。客户、订单和商店也不是 PRODUCTS 的财产。正确进行数据设计,大多数编码问题都会消失。并且不要将业务逻辑放在触发器中。
标签: oracle stored-procedures triggers