【发布时间】:2013-12-01 18:19:40
【问题描述】:
我想确保子订单日期不早于使用此触发器的订单日期:::
CREATE OR REPLACE TRIGGER suborder_date before
INSERT ON suborder FOR EACH row DECLARE suborder_dd DATE;
orderdate DATE;
BEGIN
SELECT reqshipdate INTO suborder_dd FROM suborder;
SELECT orders.orddate INTO orderdate FROM orders;
IF orderdate < suborder_dd THEN
raise_application_error(-20002,('Required Ship Date is before Order Date'));
END IF;
END;
现在编译我想测试它并将它插入到表中...... 插入子订单值 (1,1,'12-Jan-13','13-Jan-14', 'Office Depot', 1)
错误:从命令中的第 1 行开始出错:插入子顺序 值 (1,1,'12-Jan-13','13-Jan-14', 'Office Depot', 1) 错误报告: SQL 错误:ORA-01422:精确提取返回的数量超过了请求的数量 行数 ORA-06512:在“BB.SUBORDER_DATE”,第 4 行 ORA-04088:错误 在执行触发器“BB.SUBORDER_DATE”期间 01422. 00000 - “精确提取返回的行数超过了请求的行数” *原因:exact fetch 中指定的数字小于返回的行数。 *操作:重写查询或更改请求的行数
在其他人的帮助下,当我自己编辑命令时,我终于得到了我想要的输出。谢谢!
CREATE OR REPLACE TRIGGER suborder_date BEFORE
INSERT ON suborder FOR EACH row DECLARE reqship DATE; orderdate date;
BEGIN
SELECT o.orddate
INTO orderdate
FROM orders o
WHERE o.orderno = :new.orderno;
IF orderdate > :new.reqshipdate THEN
raise_application_error(-20002, ('Required Ship Date is before Order Date'));
END IF;
END;
【问题讨论】:
-
请只使用适合您问题的标签。
-
SELECT reqshipdate INTO suborder_dd FROM suborder;将尝试将子排序表中的 所有 行读取到单个变量中 - 你真的认为这会起作用吗?与第二个说法相同。而且您不需要在行级触发器中设置select值,new变量中的所有内容都可用。 -
那么正确的方法是声明变量?为 reqshipdate 做一个?我应该使用光标吗?
-
扩展 horsey 的评论,删除第一个 SELECT 并使用 "IF orderdate
-
如果我已经有一个包含订单和子订单的表格,并且我想检查某个订单的子订单是否在下订单日期之后发货,那么我不需要加入子句指示触发器内部的 order.orderno = suborder.orderno?否则,如果子订单所需的发货日期在相应的订单日期之后,我将如何比较?