有关oracle

时间:2017-11-06 00:13:28

标签: sql oracle

这是根据问题创建的表模式:

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表示创建触发器时存在复杂错误。我无法弄清楚原因。我很难过。

enter image description here

2 个答案:

答案 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)

来自comment to other answer

  

price来自sellscost来自beers。它们来自两个不同的表格。

您的触发器仅提及sells。在任何地方都没有引用beers,并且因为触发器表是sells,所以像:old.cost这样的引用不起作用,因为sells表没有这样的引用列。

由于您的代码计算了cost表中存在更改的beers值与该列的比率,我认为您打算在cost ON beers上创建触发器,而不是{{1 }}

由于price ON sellssells之间没有明显的关系,因此不清楚触发器应该更新哪些beers记录。

您似乎不太可能希望将sells中的记录插入sellsbar的空值,这是您当前的插入语句正在执行的操作。