如何解决遇到“警告:触发器因编译错误而创建”同时创建多个触发器
我试图在一个sql文件中创建多个触发器。代码如下:
CREATE OR REPLACE TRIGGER trigger_selling_price_change
AFTER INSERT OR UPDATE ON SellingPrice
FOR EACH ROW
BEGIN
dbms_output.put_line('price of phone updated');
INSERT INTO LogSellingPriceChange
VALUES(sysdate,phone_id,:old.price,:new.price);
END;
/
CREATE OR REPLACE TRIGGER trigger_purchase_cost_change
AFTER INSERT OR UPDATE ON PurchaseCost
FOR EACH ROW
BEGIN
dbms_output.put_line('purchase cost updated');
INSERT INTO LogPurchaseCostChange
VALUES(sysdate,:old.cost,:new.cost);
END;
/
CREATE OR REPLACE TRIGGER trigger_inventory_addition
AFTER INSERT ON Inventory
FOR EACH ROW
BEGIN
dbms_output.put_line('enlisted new phones in database');
INSERT INTO LogInventoryAddition
VALUES(sysdate,:old.quantity,:new.quantity);
END;
/
但是当我在pl / sql中执行它时,我得到Warning: Trigger created with compilation errors.
的三倍。
执行show_errors
后,我得到以下输出:
Errors for TRIGGER TRIGGER_INVENTORY_ADDITION:
LINE/COL ERROR
-------- -----------------------------------------------------------------
3/2 PL/SQL: SQL Statement ignored
4/18 PL/SQL: ORA-00984: column not allowed here
查询中包含的表的声明如下:
CREATE TABLE Inventory(
id number,phone_id number,quantity number,PRIMARY KEY (id),FOREIGN KEY (phone_id) REFERENCES Phone(id)
);
CREATE TABLE PurchaseCost(
id number,cost number,PRIMARY KEY(id),FOREIGN KEY (phone_id) REFERENCES Phone(id)
);
CREATE TABLE SellingPrice(
id number,price number,FOREIGN KEY (phone_id) REFERENCES Phone(id)
);
CREATE TABLE LogSellingPriceChange(
change_date date,old_price number,new_price number,FOREIGN KEY(phone_id) REFERENCES Phone(id)
);
CREATE TABLE LogPurchaseCostChange(
change_date date,FOREIGN KEY(phone_id) REFERENCES Phone(id)
);
CREATE TABLE LogInventoryAddition(
addition_date date,old_quantity number,new_quantity number,FOREIGN KEY(phone_id) REFERENCES Phone(id)
);
成功创建表后,我执行了用于创建触发器的文件。但是,我没有插入任何值。
解决方法
“不允许列”错误,因为您正尝试在没有伪密钥phone_id
或:new
的情况下直接访问:old
列,
CREATE OR REPLACE TRIGGER trigger_selling_price_change
AFTER INSERT OR UPDATE ON SellingPrice
FOR EACH ROW
BEGIN
dbms_output.put_line('price of phone updated');
INSERT INTO LogSellingPriceChange
VALUES(sysdate,:new.phone_id,:old.price,:new.price);
END;
/
您还需要更改其他触发器。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。