【问题标题】:MERGE working directly on Oracle but not going through when used via JDBCMERGE 直接在 Oracle 上工作,但在通过 JDBC 使用时不通过
【发布时间】: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 如何处理事务以及何时发生提交,所以很抱歉我不能提供更多帮助。

标签: java oracle jdbc


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2011-07-08
    • 1970-01-01
    • 2012-10-17
    • 2013-12-22
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多