【问题标题】:Oracle PLS-00049: bad bind variableOracle PLS-00049:绑定变量错误
【发布时间】:2020-10-06 04:37:14
【问题描述】:

我在尝试创建此触发器时收到此错误。我尝试了所有方法,但我不知道问题出在哪里。

代码如下:

CREATE OR REPLACE TRIGGER after_price_update
AFTER UPDATE
ON Item
FOR EACH ROW
DECLARE new_totalprice INT;
BEGIN
   IF :OLD.price <> :new.price THEN
   new_totalprice := :old.Quantity * :new.price;
        INSERT INTO OrderRecord(OrderRecord_Id, Item_Id, Employee_Id, Reservation_Id, Order_Time, Quantity, TotalPrice)
        VALUES(old.OrderRecord_Id, old.Item_Id, old.Employee_Id, old.Reservation_Id, old.Order_Time, old.Quantity, new_totalprice);
    END IF;
END;

错误是:

4/22      PLS-00049: bad bind variable 'OLD.QUANTITY'

表格如下所示:

CREATE TABLE Item (
    Item_Id int PRIMARY KEY,
    Menu_Id int,
    Name varchar2(20),
    Description varchar2(120),
    Price int,
    FOREIGN KEY(Menu_Id) REFERENCES Menu(Menu_Id)
);

CREATE TABLE OrderRecord (
    OrderRecord_Id int PRIMARY KEY,
    Item_Id int,
    Employee_Id int,
    Reservation_Id int,
    Order_Time date,
    Quantity int,
    TotalPrice int,
    FOREIGN KEY(Item_Id)References Item(Item_Id),
    FOREIGN KEY(Employee_Id)References Employee(Employee_Id),
    FOREIGN KEY(Reservation_Id)References Reservation(Reservation_Id)
);

【问题讨论】:

    标签: oracle plsql


    【解决方案1】:

    表 OrderRecord 不是正在更新的表:您不能引用该表的旧值;你需要用一些 SELECT 语句来读取这个值。

    IF :OLD.price <> :new.price THEN
       new_totalprice := <Quantity> * :new.price;
    

    【讨论】:

      【解决方案2】:

      ITEM 表中没有列 Quantity 您正在应用触发器。

      【讨论】:

        【解决方案3】:

        如果我理解您想要正确执行的操作,您似乎想在 Item 条目发生价格变化时更新所有现有 OrderRecord 条目的计算总价格。

        CREATE OR REPLACE TRIGGER after_price_update
        AFTER UPDATE
        ON Item
        FOR EACH ROW
        BEGIN
          IF NVL(:OLD.Price, 0) <> NVL(:new.Price, 0) THEN
            -- Update the child table "OrderRecord" for this item using new price
            UPDATE OrderRecord SET TotalPrice = Quantity * :new.Price WHERE Item_Id = :new.Item_id;
          END IF;
        END;
        

        请注意,此触发器位于父表 Item 上,并引用修改记录中的两个值:priceItem_Id,以更新子表 OrderRecord。 还要注意使用NVL 来监视空值,因为如果空值在任一侧,比较将不会成功。对 null 使用零是值得商榷的;可以使用一个永远不会出现的值,例如负数。

        【讨论】:

          猜你喜欢
          • 2015-08-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-08-16
          • 2019-06-05
          • 2020-10-22
          • 2022-06-13
          相关资源
          最近更新 更多