MERGE直接在Oracle上工作,但在通过JDBC使用时不会通过

时间:2015-02-18 00:42:31

标签: java oracle jdbc

我在我的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。

1 个答案:

答案 0 :(得分:0)

检查您的数据库工作台(在您的案例中是Toad)中是否有针对同一个表的未决事务。如果是这样,可能会导致阻止JDBC客户端的请求。在Toad中提交或放弃该交易,然后重试。