gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 14:08:51 25 4
gpt4 key购买 nike

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

最佳答案

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

关于java - MERGE 直接在 Oracle 上工作,但通过 JDBC 使用时不会通过,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28573968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com