【发布时间】:2015-02-18 00:42:30
【问题描述】:
我在我的 java 代码中使用以下 SQL:
String mergePositionsSQL = "MERGE INTO holding h " +
"USING (SELECT :acct_no as acct_no_param, :brand as brand_param, :cusip as cusip_param FROM DUAL) du " +
"ON (h.acct_no = du.acct_no_param AND h.brand = du.brand_param AND h.cusip = du.cusip_param) " +
"WHEN MATCHED THEN " +
"UPDATE SET "+
"h.qty = :qty, h.tdate = :tradeDate, h.settlement = :settleDate, " +
"h.acq_price = :acqPrice, h.acq_yield = :acqYield " +
"WHEN NOT MATCHED THEN " +
"INSERT (h.acct_no, h.brand, h.cusip, h.qty, h.tdate, h.settlement, h.acq_price, h.acq_yield) " +
"VALUES " +
"(:acct_no,:brand,:cusip,:qty,:tradeDate,:settleDate,:acqPrice,:acqYield)";
当我在 Toad 上运行此查询时,它按预期工作,但当我通过 JDBC 执行它时,它卡住了,从不做任何事情。这里有什么问题?
此外,是否有另一种方法可以在 Oracle 中安全地完成此构造,即在记录不存在时插入并在存在时更新它。
这是运行此查询的代码:
NamedParameterJdbcTemplate jdbc = new NamedParameterJdbcTemplate(ds);
Map<String, Object> parameters = new HashMap<String, Object>();
parameters.put("acct_no", accountNumber);
parameters.put("brand", brand);
parameters.put("cusip", position.getCusip());
parameters.put("qty", position.getQty());
parameters.put("tradeDate", position.getTradeDate());
parameters.put("settleDate", position.getSettleDate());
parameters.put("acqPrice", position.getAcqPrice());
parameters.put("acqYield", position.getAcqYield());
jdbc.update(mergePositionsSQL, parameters);
我在上面的代码中使用的是 Spring JDBC。
【问题讨论】:
-
您需要发布您的代码和您遇到的错误。您在此处绑定了变量,例如“:acct_no”,当您通过 JDBC 运行它们时,您需要设置它们的值。没有看到您的代码,我们无法知道您在做什么。
-
代码已添加,请查看。
-
不熟悉spring。我搜索了 NamedParameterJdbcTemplate,你的代码似乎很好。如果它没有给出错误,我只能建议您检查是否正在提交更改。我不知道 spring 如何处理事务以及何时发生提交,所以很抱歉我不能提供更多帮助。