该方案如下 -
流程是这样的 -
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;
问题 -
答案 0 :(得分:0)
据我所知,没有时间问题。
截至触发代码:and rownum = 1
条件的目的是什么?我不是说它是错误的,我只是在问。您希望该查询返回多行吗?如果是这样,这是合法的情况吗?你宁愿用WHEN TOO_MANY_ROWS
异常处理程序(即不使用ROWNUM条件)处理它吗?
如果SELECT没有返回任何内容会怎样?它然后引发NO_DATA_FOUND
异常并且触发失败并且当然不会插入任何内容。它是否被传播以便某人(人类)或某物(错误记录程序)看到/捕获它以便您知道出现了问题?
当然,事实上V_ORDER_TYPE保持为NULL会导致INSERT失败(如P. Salmon已经建议的那样)。