【问题标题】:Comparing two dates with an insert trigger使用插入触发器比较两个日期
【发布时间】: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?否则,如果子订单所需的发货日期在相应的订单日期之后,我将如何比较?

标签: sql oracle triggers


【解决方案1】:

如果你关注 cmets,你应该会得到这样的东西:

CREATE OR REPLACE TRIGGER suborder_date
  BEFORE INSERT ON suborder 
  FOR EACH row 
  DECLARE 
    orderdate DATE;
  BEGIN

    SELECT o.orddate
    INTO   orderdate
    FROM   orders o
    WHERE  o.order_id = :new.order_id;

    IF orderdate < :new.suborder_dd THEN
      raise_application_error(-20002, ('Required Ship Date is before Order Date'));
    END IF;
  END;

【讨论】:

  • 谢谢!当我为自己编辑命令时,我终于得到了我想要的输出。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-11
  • 2019-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-06-19
  • 2021-09-18
相关资源
最近更新 更多