这是根据问题创建的表模式:
INSERT INTO sells(bar, beer, price) VALUES ('Sue''s Bar', 'Miller', 2.75);
INSERT INTO sells(bar, beer, price) VALUES ('Tom''s Bar', 'Miller', 2.5);
INSERT INTO sells(bar, beer, price) VALUES ('Cox', 'Miller', 2.75);
INSERT INTO beers(name, manf, cost) VALUES ('Winterbrew', 'Pete''s', 2.1);
INSERT INTO beers(name, manf, cost) VALUES ('Bud Lite', 'Anheuser-Busch', 2.2);
INSERT INTO beers(name, manf, cost) VALUES ('Bud', 'Anheuser-Busch', 2.3);
以下是问题: 湾请在Oracle中写一个名为hw06b的触发器来改变啤酒的价格 啤酒的成本发生了变化。例如,如果啤酒的成本从2.0美元变为2.2美元,那么 每个酒吧的啤酒价格应该增加10%。
这是我的代码。
CREATE TRIGGER hw06b AFTER UPDATE OF price ON sells
FOR EACH ROW
DECLARE
ratio real;
begin
ratio = (:new.cost - :old.cost)/ :old.cost;
insert into sells(price) values (:old.cost*(1+ratio));
end;
它看起来语法正确,但ORACLE表示创建触发器时存在复杂错误。我无法弄清楚原因。我很难过。
答案 0 :(得分:1)
您不希望在定义触发器的表中插入新行。我想你只想更新正在更新的行中的值。
为此,请在更新触发器之前使用:
CREATE TRIGGER hw06b BEFORE UPDATE OF price ON sells
FOR EACH ROW
DECLARE
ratio real;
BEGIN
ratio := (:new.cost - :old.cost)/ :old.cost;
:new.price := :old.cost * (1 + ratio);
END;
答案 1 :(得分:0)
price
来自sells
,cost
来自beers
。它们来自两个不同的表格。
您的触发器仅提及sells
。在任何地方都没有引用beers
,并且因为触发器表是sells
,所以像:old.cost
这样的引用不起作用,因为sells
表没有这样的引用列。
由于您的代码计算了cost
表中存在更改的beers
值与该列的比率,我认为您打算在cost ON beers
上创建触发器,而不是{{1 }}
由于price ON sells
和sells
之间没有明显的关系,因此不清楚触发器应该更新哪些beers
记录。
您似乎不太可能希望将sells
中的记录插入sells
和bar
的空值,这是您当前的插入语句正在执行的操作。