數據庫表數據傳輸到Oracle方案

方案步驟爲:數據導出到文件(增量或全量),通知接口文件就緒(上傳到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(「)」);

四:設計

相關文章
相關標籤/搜索