Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 配料;更新与插入;对Oracle数据库的查询_Java_Database_Oracle_Jdbc - Fatal编程技术网

Java 配料;更新与插入;对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

假设我有一个Oracle数据库,其中有一个名为
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)
。否则,在添加/删除列时,您可能会遇到令人不快的意外情况,或者(更糟糕的是)开发人员和生产人员之间的列顺序不同。