【Java/shell/Oracle】Java使用Runtime和Process调用sqlldr命令向Oracle数据库某表批量塞入数据
【前篇】
https://www.cnblogs.com/heyang78/p/16021687.html
【需求】
通过JDBC Batch的方式通过网络传输数据仍嫌不足,希望在数据迁移目标的服务器上建立目录,将csv格式的数据文件传输过去然后使用sqlldr批量导入数据。
要实现这个需求需要在服务器端建立一个Java程序,然后通过调用这个程序来间接调用sqlldr。
【代码】
package com.hy.lab.shell1; import java.io.BufferedReader; import java.io.InputStreamReader; public class OracleCtlTest { public static void main(String[] args) throws Exception{ Runtime runtime = Runtime.getRuntime(); Process prcs= runtime.exec("sqlldr userid=luna/1234@127.0.0.1:1521/orcl control=c:\\temp\\loaddata.ctl"); BufferedReader bufReader = new BufferedReader(new InputStreamReader(prcs.getInputStream(), "GBK")); String line = null; while ((line = bufReader.readLine()) != null) { System.out.println(line); } int errCode = prcs.waitFor(); System.out.println("Exited with error code:" + errCode); } }
【代码使用到的控制文件loaddata.ctl】
options(skip=0,BINDSIZE=20971520, ROWS=10000, READSIZE=20971520, ERRORS=999999999) load data infile 'c:\temp\emp_test.csv' insert into table "EMP_TEST" fields terminated by ',' Optionally enclosed by '\'' (id,name,age)
以上标红色的位置是需要指明的数据文件,表名和字段名,这些还是需要通过网络传输的。
【输出】
SQL*Loader: Release 11.2.0.1.0 - Production on 星期一 3月 21 09:32:26 2022 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. 达到提交点 - 逻辑记录计数 3 达到提交点 - 逻辑记录计数 4 Exited with error code:0
【控制文件指向的CSV中数据】
1,andy,23 2,bill,24 3,cindy,25 4,douglas,26
这个csv,是生成后需要用FTP的方式送到数据迁移目标的服务器上某目录的,传完了再通知服务器上程序(即本程序的完整版)开始运作。
【执行完毕后数据库中数据】
SQL> truncate table emp_test; 表被截断。 SQL> select * from emp_test; 未选定行 SQL> select * from emp_test; ID NAME AGE ---------- -------------------- ---------- 1 andy 23 2 bill 24 3 cindy 25 4 douglas 26
由此可见任务已经完成。
END