场景为以下 -
- 用" OrderId"one_answers" ordertype"列的OrderTable
- 可以使用" OrderId"one_answers" Custid"列的OrderRelationtte
- 可订购列的列,可与列" 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代码后,db将具有订购记录可用的订单记录?(假设更新的标志为true(
- 应用程序代码和触发器是否有时间问题?例如,当触发时调用从OrderTable调用Select语句?(当然,订单ID在可订购和订购中匹配(
- 基本上我的问题是,有时(很少((很少(该记录即使应该通过扳机插入订单处理(即使应该(订单类型不是零((?有什么想法吗?
据我所知,没有时间问题。
从触发代码开始:and rownum = 1
条件的目的是什么?我并不是说这是错误的,我只是在问。您是否希望该查询将返回几行?如果是这样,那是法律情况吗?您是否宁愿使用WHEN TOO_MANY_ROWS
异常处理程序(即而不是使用Rownum条件(来处理它?
如果选择什么都不返回,会发生什么?然后提高NO_DATA_FOUND
异常和触发失败,当然不会插入任何内容。它是传播的,以便某人(人类(或某物(错误记录程序(看到/抓住它,以便您知道某事会出现问题吗?
当然,v_order_type保持null的事实会导致插入失败(如P. Salmon已经建议(。