Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/87.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 将当前数据库条目与要插入的新数据同步_Java_Sql_Oracle - Fatal编程技术网

Java 将当前数据库条目与要插入的新数据同步

Java 将当前数据库条目与要插入的新数据同步,java,sql,oracle,Java,Sql,Oracle,我必须将数据库表中的数据与sql查询中的新数据同步,在sql查询中,我需要删除不在新数据中的当前条目,并插入不在当前数据中的新条目。我可以使用以下伪代码在java中实现这一点: // 1) get all data in database and store it in list (currentList) // 2) get new data obtained through sql query and store it in list (newList) // 3) sync both li

我必须将数据库表中的数据与sql查询中的新数据同步,在sql查询中,我需要删除不在新数据中的当前条目,并插入不在当前数据中的新条目。我可以使用以下伪代码在java中实现这一点:

// 1) get all data in database and store it in list (currentList)
// 2) get new data obtained through sql query and store it in list (newList)
// 3) sync both list

for(entry : currentList) {
    if(newList.contains(entry))
        finalList.add(entry) 
}

for(entry : newList) {
    if(!finalList.contains(entry))
        finalList.add(entry)
}

// 4) delete all data from DB
// 5) insert finalList data to DB
它工作得很好,但是,我认为它在处理大量数据时会有性能问题,因为我正在删除所有内容并重新插入整个列表,而不是仅仅插入新条目并删除在新数据中找不到的条目

你能建议一个更好的方法吗?是否可以创建一个sql查询来处理数据同步问题?

请看一看

构造将允许您指定更新现有记录或添加新记录的条件

它基本上看起来像:

MERGE 
   INTO target_table
   USING source_table
 ON (some condition)
WHEN MATCHED 
     ( UPDATE some_update_statement )
WHEN NOT MATCHED 
     ( INSERT some_insert_statement )

您还可以在存储过程中执行这些操作,以避免不必要地增加数据库通信量

然而,这对于大量的条目(比如数百万条条目)或者每个条目都是非常大的条目是不起作用的。在这种情况下,尝试使用上面Ryan指出的合并操作

考虑以下PL/SQL伪代码(您可能希望根据您的用例对其进行更改):

PROCEDURE replace_with_list (newList) AS
BEGIN
  /* Delete all the entries that are not present in the newList (e.g. by ID) */
  /* Insert all the entries that present in newList and not present in your table  */
END;