Я использую следующий код SQL в своем java-коде:
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)";
Когда я запускаю этот Query on 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 в приведенном выше коде.
Проверьте, есть ли открытая транзакция, ожидающая работы вашего инструментария DB (в вашем случае Toad) в той же таблице. Если это так, это может привести к блокировке запросов от вашего клиента JDBC. Зафиксируйте или отмените транзакцию в Toad и повторите попытку.