Java 配料;更新与插入;对Oracle数据库的查询
假设我有一个Oracle数据库,其中有一个名为Java 配料;更新与插入;对Oracle数据库的查询,java,database,oracle,jdbc,Java,Database,Oracle,Jdbc,假设我有一个Oracle数据库,其中有一个名为RUN\u LOG的表,用于记录作业执行的时间 该表有一个主键JOB\u NAME,它唯一地标识已执行的作业,还有一个名为LAST\u RUN\u TIMESTAMP的列,它反映作业上次执行的时间 当作业启动时,我希望更新作业的现有行(如果存在),或者在表中插入新行 由于Oracle不支持替换为样式的查询,因此有必要尝试更新,如果零行受到影响,则使用插入 这通常是通过jdbc通过以下方式实现的: PreparedStatement updateSta
RUN\u LOG
的表,用于记录作业执行的时间
该表有一个主键JOB\u NAME
,它唯一地标识已执行的作业,还有一个名为LAST\u RUN\u TIMESTAMP
的列,它反映作业上次执行的时间
当作业启动时,我希望更新作业的现有行(如果存在),或者在表中插入新行
由于Oracle不支持替换为
样式的查询,因此有必要尝试更新
,如果零行受到影响,则使用插入
这通常是通过jdbc通过以下方式实现的:
PreparedStatement updateStatement = connection.prepareStatement("UPDATE ...");
PreparedStatement insertStatement = connection.prepareStatement("INSERT ...");
updateStatement.setString(1, "JobName");
updateStatement.setTimestamp(2, timestamp);
// If there are no rows to update, it must be a new job...
if (updateStatement.executeUpdate() == 0) {
// Follow-up
insertStatement.setString(1, "JobName");
insertStatement.setTimestamp(2, timestamp);
insertStatement.executeUpdate();
}
这是一条走得相当好的道路,我对这种方法非常满意
然而,让我们假设我的用例需要插入大量的记录。对数据库执行单独的SQL查询将过于“健谈”。相反,我想开始批处理这些
INSERT
/UPDATE
查询
由于UPDATE
查询的执行将推迟到提交批处理之后,我无法观察到有多少行会受到影响,直到稍后的日期
实现这种类似于的结果的最佳机制是什么
我宁愿避免使用存储过程,因为我更愿意将持久性逻辑保存在这个地方(类),而不是将其分布在Java代码和数据库之间。SQL MERGE语句呢。您可以将大量记录插入临时表,然后将临时表与运行日志合并,例如:
merge into RUN_LOG tgt using (
select job_name, timestamp
from my_new_temp_table
) src
on (src.job_name = tgt.job_name)
when matched then update set
tgt.timestamp = src.timestamp
when not matched then insert values (src.job_name, src.timestamp)
;
那么SQL合并语句呢。您可以将大量记录插入临时表,然后将临时表与运行日志合并,例如:
merge into RUN_LOG tgt using (
select job_name, timestamp
from my_new_temp_table
) src
on (src.job_name = tgt.job_name)
when matched then update set
tgt.timestamp = src.timestamp
when not matched then insert values (src.job_name, src.timestamp)
;
对不起,我不明白:合并怎么样?对不起,我不明白:合并怎么样?我完全不知道
MERGE
语句,谢谢!我建议显式枚举INSERT
部分中的列名:INSERT(tgt.job\u name,tgt.timestamp)值(src.job\u name,src.timestamp)
。否则,当添加/删除列时,您可能会遇到令人不快的惊喜,或者(更糟糕的是)开发和生产之间的列顺序不同。我完全不知道MERGE
语句,谢谢!我建议显式枚举INSERT
部分中的列名:INSERT(tgt.job\u name,tgt.timestamp)值(src.job\u name,src.timestamp)
。否则,在添加/删除列时,您可能会遇到令人不快的意外情况,或者(更糟糕的是)开发人员和生产人员之间的列顺序不同。