合并命令后获取主键值?

时间:2009-08-07 18:40:44

标签: java oracle jdbc merge primary-key

有没有办法从最后插入或更新的行中获取值?

如果行存在,我使用merge命令进行插入或更新。我知道如何在插入后获取自动生成的密钥但是如果我使用merge命令可以获得主键吗?

我正在使用Java和JDBC和Oracle DB。

4 个答案:

答案 0 :(得分:2)

正如APC所说:“与INSERT不同,Oracle MERGE语法不支持RETURNING子句。唉。”

我担心最简单的答案是将业务逻辑实现为实现业务逻辑的PL / SQL函数,并返回您感兴趣的值。

将进程分解为PL / SQL中的步骤,以检查该行是否已存在不应该太慢,因为您应该(我认为)对主键(或至少是唯一索引列)进行直接查找

答案 1 :(得分:1)

远景:您可以在数据库中编写一个触发器,为任何更新或插入添加时间戳,并将时间戳放在您将命名的新列中:最后修改(或类似的内容)。然后按此列排序以获取最后编辑的行。

答案 2 :(得分:1)

阅读完这篇文章后,经历了一段短暂的拒绝,寻找某种方式使这项工作与MERGE声明一致,然后最终接受了APC的评论,我已经确定了以下可能对某人有帮助的替代方案否则:

public List upsert(String updateSql, String insertSql, Map data){
  List ids = new ArrayList();
  Map params = new HashMap();
  params.put("name", data.get("name"));
  if(data.get("personId") != null){
    params.put("personId", data.get("personId"));
    int rowCount = jdbcTemplate.update(updateSql, params);
    if(rowCount == 1){
      ids.add(data.get("personId"));
    }
  }else{
    keyHolder = new GeneratedKeyHolder();
    int rowCount = jdbcTemplate.update(insertSql, params, keyHolder);
    if(rowCount == 1){
      ids.add(keyHolder.getKey().intValue());
    }
  }
  return ids;
}

答案 3 :(得分:0)

我使用更高级别的持久层来解决这个问题。我的解决方案是进行插入,然后获取生成的ID并更新到行中。我没有意识到,但我还没有找到更好的解决方案。

但是,我发现通常非主键列的组合将产生唯一的行。如果您可以在数据库中标识此数据,我建议在列上设置唯一约束,以确保它们是唯一的。一旦您有另一种访问唯一行的方法,您可以使用它来进行合并。

相关问题