如何将DB中的结果集转换为Java中的merge语句?

时间:2018-10-24 12:40:41

标签: java database jdbc

我有2个模式。

我想先在源模式中执行select查询,然后将结果集转换为merge语句,然后将其合并为目标模式。

有可能吗?

之所以不进行插入,是因为目标模式中已经存在记录的可能性,该记录在插入时会引发唯一约束。

再加上一点:源数据库和目标数据库位于不同的服务器上。

1 个答案:

答案 0 :(得分:0)

  

有可能吗?

不确定您为什么认为这不可能。有什么具体原因吗?

我正在回答,因为您已经用 jdbc 对其进行了标记,这意味着您正在寻找与数据库无关的解决方案,并且仅使用Java。

合并意味着-如果目标数据库中已存在该行,则更新行,否则在目标数据库中插入新行(搜索条件为主键)。

因此,请在源数据库上运行select,对其进行迭代并在迭代循环中进行

  1. 在目标数据库上对WHERE子句
  2. 中的主键列进行选择
  3. 如果在目标数据库中找到结果,请创建一个UPDATE PreparedStatement,从源数据中的update prepare语句中设置值,然后添加到批处理中(即,不执行它)< / p>

  4. 如果在第2步中未找到任何行,请创建INSERT PreparedStatement,根据源数据在准备好的语句中设置值并添加到批处理中

  5. 如果达到批次阈值,请执行在步骤2和3中准备的批次。
  6. 转到步骤1。

或者,您可以尝试插入单个行,如果抛出约束冲突,请尝试在catch块中更新该行。使用这种方法,如上所述,insert&batch语句不能成批执行。

第三种方法是直接使用MERGE语句(如果目标数据库支持它),如图here所示,请看方法-public static void MergeTables(Connection conn)。可以使用jdbc语句executeUpdate方法执行MERGE。

请注意,以上步骤仅涉及在循环中运行步骤1的性能-可能有太多的DB调用需要大量数据。因此,此类工作通常在专门的ETL工具(Informatica等)或PL / SQL中完成。