缺少使用触发器(Oracle DB)在表上的插入记录



场景为以下 -

  1. 用" OrderId"one_answers" ordertype"列的OrderTable
  2. 可以使用" OrderId"one_answers" Custid"列的OrderRelationtte
  3. 可订购列的列,可与列" OrderId"," ordertype"," CustId"one_answers" ProcessFlag"

流动如下 -

application1在订购中创建记录 ->然后通过使用MQ协议将记录传递给Application2,在这种情况下,应用程序2在这种情况下插入/创建在OrderRelationTable中传递的记录 ->然后在Oracle DB中调用触发器以创建记录在OrderProcestable

问题

有时,记录不插入表3订购过程中。不确定是否是通过计时引起的,还是触发器不正确的东西?

application1代码


    boolean updated = false;
    /** JDBC prepare statement execution insert into OrderTable in Java**/
    int rowCount = ps.executeUpdate();
    if(rowCount>0){
    updated=true;
    }
    log.log("updated flag:"+updated);
    /** I am able to see the log shows the flag is true, and recored inserted into OrderTable **/

Application2代码假设这是一些Java JDBC代码,这并没有多大重要。

触发器

假设语法是正确的。

CREATE OR REPLACE TRIGGER INSERTINTOOrderProcessTable
AFTER INSERT ON OrderRelationTable
FOR EACH ROW DECLEAR
         v_order_type := null;
BEGIN
         SELECT OrderType INTO v_order_type FROM OrderTable
         WHERE OrderId = :new.OrderId
         AND OrderType IS NOT NULL
         AND rownum=1;
      IF v_order_type IS NOT NULL THEN
         INSERT INTO OrderProcessTable VALUES (:new.OrderId, v_order_type, :new.CustId, 'N');
      END IF;
END;

问题 -

  1. 执行应用程序1代码后,db将具有订购记录可用的订单记录?(假设更新的标志为true(
  2. 应用程序代码和触发器是否有时间问题?例如,当触发时调用从OrderTable调用Select语句?(当然,订单ID在可订购和订购中匹配(
  3. 基本上我的问题是,有时(很少((很少(该记录即使应该通过扳机插入订单处理(即使应该(订单类型不是零((?有什么想法吗?

据我所知,没有时间问题。

从触发代码开始:and rownum = 1条件的目的是什么?我并不是说这是错误的,我只是在问。您是否希望该查询将返回几行?如果是这样,那是法律情况吗?您是否宁愿使用WHEN TOO_MANY_ROWS异常处理程序(即而不是使用Rownum条件(来处理它?

如果选择什么都不返回,会发生什么?然后提高NO_DATA_FOUND异常和触发失败,当然不会插入任何内容。它是传播的,以便某人(人类(或某物(错误记录程序(看到/抓住它,以便您知道某事会出现问题吗?

当然,v_order_type保持null的事实会导致插入失败(如P. Salmon已经建议(。

最新更新