使用Trigger(Oracle DB)

时间:2018-02-10 01:37:31

标签: sql-server oracle triggers oracle-sqldeveloper

该方案如下 -

  1. 包含“OrderId”和“OrderType”列的订单表
  2. OrderRelationTable,列为“OrderId”和“CustId”
  3. OrderProcessTable,列为“OrderId”,“OrderType”,“CustId”和“ProcessFlag”
  4. 流程是这样的 -

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

    中创建记录

    问题

    有时记录未插入表3 OrderProcessTable。不确定它是由定时引起的还是触发器有不正确的东西?

    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代码 假设它是一些插入OrderRelationTable并且成功的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是否可以为SELECT语句提供OrderTable记录? (假设更新的标志为真)
    2. 应用代码和触发器是否存在计时问题?例如,当trigger从OrderTable调用SELECT语句时? (当然订单ID在OrderRelationTable和OrderTable中匹配)
    3. 基本上现在我的问题是有时(很少)记录没有通过触发器插入OrderProcessTable,即使它应该(Order Type不为null)?有什么想法吗?

1 个答案:

答案 0 :(得分:0)

据我所知,没有时间问题

截至触发代码:and rownum = 1条件的目的是什么?我不是说它是错误的,我只是在问。您希望该查询返回多行吗?如果是这样,这是合法的情况吗?你宁愿用WHEN TOO_MANY_ROWS异常处理程序(即不使用ROWNUM条件)处理它吗?

如果SELECT没有返回任何内容会怎样?它然后引发NO_DATA_FOUND异常并且触发失败并且当然不会插入任何内容。它是否被传播以便某人(人类)或某物(错误记录程序)看到/捕获它以便您知道出现了问题?

当然,事实上V_ORDER_TYPE保持为NULL会导致INSERT失败(如P. Salmon已经建议的那样)。