MERGE работает напрямую с Oracle, но не проходит через JDBC

1

Я использую следующий код 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 в приведенном выше коде.

  • 0
    Вы должны опубликовать свой код и ошибки, которые вы получаете. здесь у вас есть связанные переменные, такие как:: acct_no, и когда вы запускаете их через JDBC, вам нужно установить их значения. не видя ваш код, мы не можем знать, что вы делаете.
  • 0
    код добавлен, пожалуйста, посмотрите на него.
Показать ещё 1 комментарий
Теги:
jdbc

1 ответ

0

Проверьте, есть ли открытая транзакция, ожидающая работы вашего инструментария DB (в вашем случае Toad) в той же таблице. Если это так, это может привести к блокировке запросов от вашего клиента JDBC. Зафиксируйте или отмените транзакцию в Toad и повторите попытку.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню