一,JAVA 为oracle 制造数据
第一步依然是导入jar包:ojdbc6_g.jar 驱动包。
下面仅仅介绍了
//import oracle.jdbc.driver.OracleDriver; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.text.SimpleDateFormat; import java.util.Date; public class dddd { public static void main(String[] args) throws SQLException,Exception{ String DB_URL = "jdbc:oracle:thin:@192.168.7.198:1521:xdsit"; // Class.forName("oracle.jdbc.OracleDriver"); int ra=0; Connection conn = DriverManager.getConnection(DB_URL,"LOANAUDITUSER","zytest1"); Connection conn2 = DriverManager.getConnection(DB_URL,"LOANAUDITUSER","zytest1");
//这一步是在创建游标,所以一定要记得关闭游标 PreparedStatement sql=conn.prepareStatement("SELECT LOGIN_CODE FROM ZHPH_SYS_USER"); ResultSet rs = sql.executeQuery(); PreparedStatement pst = conn2.prepareStatement("insert into ZHPH_REPAY_INFO (id,loan_contract_no) values(?,?)"); while(rs.next()){ ra++; String LOAN_CONTRACT= rs.getString("LOGIN_CODE");//hetong //1万次循环 pst.setString(1,"test_"+LOAN_CONTRACT+ra); pst.setString(2,LOAN_CONTRACT); pst.addBatch(); //每5000次提交一次 if(ra%5000==0){//可以设置不同的大小;如50,100,500,1000等等 System.out.println("插入开始................"+new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(new Date())); pst.executeBatch(); conn2.commit(); pst.clearBatch(); System.out.println(ra+".............插入结束................"+new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(new Date())); } }
//为了保证后面不到5000倍数的数据,能够提交成功
System.out.println("插入开始................"+new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(new Date()));
pst.executeBatch();
conn2.commit();
pst.clearBatch();
System.out.println(ra+".............插入结束................"+new SimpleDateFormat("yyyy/MM/dd-HH:mm:ss:SSS").format(new Date()));
System.out.println("总共有数据"+ra);
}
}
注意一点,
PreparedStatement pst = conn2.prepareStatement("insert into ZHPH_REPAY_INFO (id,loan_contract_no) values(?,?)");不能放在循环中,这将导致oracle 会为每一次循环创建一个游标,最终就会出现游标超限的问题
什么是游标:
参见:Oracle 性能优化 之 游标及 SQL
每个sql就会有一个与之相关的游标,不同的sql就会产生不同的游标,这也是为什么要绑定变量。
二,JAVA 调用存储过程
import java.sql.*; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; String DB_URL = "jdbc:oracle:thin:@sit1-oracle.zhph.lan:1521/xjsit"; // Class.forName("oracle.jdbc.OracleDriver"); try { conn2 = DriverManager.getConnection(DB_URL,"crmUser","crmusertest"); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //调用存储过程,这里需要注意,存储过程写了多少个参数,你就需要写多少个问号,该传值的定义传值类型和传对应的值,该获取值的要定义获取的值类型 CallableStatement cs=conn2.prepareCall("{call crmuser.pkg_data_exchange.pro_clear_data(?)}"); //给存储过程定义输出参数的类型 cs.registerOutParameter(1, java.sql.Types.NUMERIC); cs.executeUpdate(); cs.close();
浙公网安备 33010602011771号