Sql 我应该使用什么触发器或约束?
在SQLDeveloper中,我创建了一个表Sql 我应该使用什么触发器或约束?,sql,oracle,triggers,constraints,Sql,Oracle,Triggers,Constraints,在SQLDeveloper中,我创建了一个表 Bill (id,nr,cost,days,total -all integers) 我需要创建一个约束(或触发器-什么是最好的)来进行操作 IF nr > 10 then total = total -5 (total = nr * cost * days ). CREATE OR REPLACE TRIGGER discount AFTER INSERT OR UPDATE ON Bill UPDATE Bill se
Bill (id,nr,cost,days,total -all integers)
我需要创建一个约束(或触发器-什么是最好的)来进行操作
IF nr > 10 then total = total -5 (total = nr * cost * days ).
CREATE OR REPLACE TRIGGER discount
AFTER INSERT OR UPDATE ON Bill
UPDATE Bill
set total = nr * cost * nr - 5;
WHEN (nr_slide > 10 )
我可以在触发器中使用更新吗 我也不这么认为,您的表不应该有
Total
列。相反,您应该有一个从账单
中选择并计算总额
的视图。差不多
SELECT
id,
nr,
days,
CASE WHEN nr > 10 THEN
(nr * cost * days) - 5
ELSE
(nr * cost * days)
END AS 'Total'
FROM view_Bill
约束只能防止将错误的值放入表中。若使用constraint,则需要计算total的正确值并插入到表中,否则不会插入任何行。这意味着你需要一个触发器
CREATE OR REPLACE TRIGGER discount
AFTER INSERT OR UPDATE ON Bill
for each row -- I added it here
begin
IF :new.nr > 10 then
:new.total = :new.nr * :new.cost * :new.days - 5;
END IF;
end;
如果这是一个教育项目-没问题(当然,这是一个问题-这是一个非常糟糕的教育例子)。在实际应用中,请使用Ash Burlaczenko的advise。这是我的项目中的请求。若要添加总计列,然后添加约束/触发器,使其行为类似于此,我得到此错误,则无法在触发器主体54029中更新虚拟列。0000-“无法在触发器正文中更新虚拟列”*原因:试图更改触发器正文中虚拟列的值*操作:这是无效的,请更改触发器定义。@AdiMuntean这将从根本上改变情况!如果使用虚拟列,首先应该提到它,然后在表的DDL中使用这个表达式。-还有,我如何在表的DDL中使用它?这就是请求:“创建一个包含这些列的表,总列是根据nr、天数和成本计算的。我创建的表是这样的:创建表账单(…总计为(nr*成本*天数));约束对您没有帮助,不需要触发器。相反,使用视图(根据Ash的回答)或生成的列。