这里不允许列
CREATE OR REPLACE TRIGGER update_QOH
BEFORE INSERT ON ORDERLINE
FOR EACH ROW
DECLARE
QOH_PRODUCT PRODUCT.QOH%TYPE;
ORD_NO ORDERS.ORDER_NO%TYPE;
BEGIN
SELECT QOH INTO QOH_PRODUCT FROM PRODUCT
WHERE :old.product_no = :new.product_no;
SELECT ORDER_NO INTO ORD_NO FROM ORDERLINE
WHERE :old.order_no = :new.order_no;
IF (:new.QTY <= QOH_PRODUCT) THEN
UPDATE PRODUCT SET QOH = QOH_PRODUCT - :new.QTY;
ELSE
send_email(ord_no, 'Backorder');
INSERT INTO BACKORDER
VALUES (backorder_no_seq.NEXTVAL, :new.product_no, :new.qty, SYSDATE);
INSERT INTO PRODVENDOR
VALUES (po_no_seq.NEXTVAL, vendor_no, :new.product_no, vend_qty,
shipping_method, SYSDATE, NULL, NULL, NULL);
END IF;
END;
/
-------------------------------------------------------------------------------
Error(13,3): PL/SQL: SQL Statement ignored
Error(13,91): PL/SQL: ORA-00984: column not allowed here
--------------------------------------------------------------------------------
产品表(P_no,QOH等)
订单行表(OL_no,QTY等)
延期交货表(B_no,B_QTY等)
供应商表(V_no等)
我需要确保当客户购买产品时,产品表中有足够的QOH,如果有,产品中的QOH应该减少(更新)。如果没有,请向客户发送电子邮件,更新延期交货表,并从供应商处订购产品。
没有找到相关结果
已邀请:
3 个回复
布埃郝卞簿
至
在PL / SQL中,
是赋值运算符,因此在设置PL / SQL变量时请使用它。 无论编译错误的来源是什么,从触发器发送电子邮件似乎都是个坏主意。
豹芜澈
和
中选择
。我不确定
是否设置在插入前触发器中,但如果是,它将与
或null相同,所以你可能会得到ORA-02112或ORA-01403错误,因为它会找到所有行,或者没有。 b)从
中选择将不返回第一个订单行上的行和从第三个订单行开始的多行,因此您将再次收到ORA-01403和ORA-02112错误。但是,因为你只是选择你所查询的价值,这是毫无意义的。您只需在电子邮件通话中使用
值即可。 c)您对
的更新没有
条款,因此所有QOH值都将更新。
d)插入到
的
,
和
在哪里?这是跳出来的唯一明显的编译错误。 e)您没有在插入中指定表格列。如果您的值顺序错误或任何丢失,这将导致编译错误,但您无法通过查看代码来判断。 (你还没有说过@WW改变之后'可能'错误是什么,所以不知道这是否相关)。如果稍后添加了另一列,则此触发器将变为无效,因此通常明确列出列是个好主意。 从功能上来说,您似乎正在发送一封电子邮件,说明整个订单都是按订单生产的,而不仅仅是这个产品;并且在当前的订单和你所投入的
和
之间似乎没有任何联系。
呈辖玫割善