方案步驟爲:數據導出到文件(增量或全量),通知接口文件就緒(上傳到ftp或提供下載url),接收方下載文件,解析文件併入庫。Oracle須要創建對應的臨時表和正式表,入庫步驟爲:清空臨時表,批量插入數據,再合併到正式表。sql
1、數據:app
數據能夠推送,也能夠拉取,能夠考慮以數據最新日期爲臨界點ui
數據能夠導出到文件,也能夠接口請求正文直接傳輸,字段分隔符可選|@|url
2、SQL:設計
清空臨時表orm
delete from temp_table;blog
臨時表批量插入:values後面動態生成,批量插入時有多行into,數據量過大時建議按1000條數據分多條sql插入接口
insert allget
into temp_table values (‘id_1’,’value_1’)it
into temp_table values (‘id_2’,’value_2’)
select 1 rom dual;
合併數據到正式表:update set不能更新主鍵id,values後面動態生成
merge into formal_table n
using (select * from temp_table t on t.id=n.id)
when matched then update set n.name=t.name,n.age=t.age
when not matched then insert into formal_table values (t.id,t.name,t.age);
三:Java:JdbcTemplate,執行sql語句時不能有末尾的分號
JdbcTemplate jdbc = new JdbcTemplate(dataSource); //使用已配置好的數據源
SqlRowSet rowSet = jdbc.queryForRowSet(「select * from temp_table where rownum=1「); //臨時表和正式表結構徹底同樣
String[] columnNames = rowSet.getMetaData().getColumnNames(); //獲取表的全部列
jdbc.update(sql); //執行insert或merge語句
String[] values=StringUtils.splitByWholeSeparatorPreserveAllTokens(line,」|@|」); //切分數據行
StringBuilder sqlInsert = new StringBuilder(「insert all\n」); //拼接sql insert語句
sqlInsert.append(「into temp_table values (‘「).append(StringUtilis.join(split,」’,’」,0,Math.min(split.length, columnNames.length))).append(「’)\n」);
sqlInsert.append(「select 1 from dual」);
StringBuilder sqlMerge = new StringBuilder(「merge into formal_table n\n」); //拼接sql merge語句
sqlMerge.append(「using (select * from temp_table) t on t.id=n.id\n」);
sqlMerge.append(「when matched then update set 」);
for(int i=1;i<columnNames.length;i++) sqlMerge.append(「n.」+columnNames[i]+」=t.」+columnNames[i]+」,」); //不更新主鍵i=0
sqlMerge.setCharAt(sqlMerge.length()-1, ‘\n’); //替換末尾逗號爲換行符
sqlMerge.append(「when not matched then insert values (t.」).append(StringUtils.join(columnNames, 「,t.」)).append(「)」);
四:設計