精华内容
下载资源
问答
  • java批量插入方法代码和一些注释
  • oracle数据库 使用游标循环更新数据

    千次阅读 2018-07-26 15:36:21
    Java中有多种实现循环的方式,数据库中可使用游标实现循环操作数据。 1. 存储过程中(较为严谨的写法) CREATE OR REPLACE PROCEDURE PROCEDURE_NAME(PI_BATCHNO IN PKG_GLOBALS.T_BATCHNO) AS VC_SPNAME PKG_...

    Java中有多种实现循环的方式,数据库中可使用游标实现循环操作数据。

    1. 存储过程中(较为严谨的写法)

    CREATE OR REPLACE PROCEDURE PROCEDURE_NAME(PI_BATCHNO IN  PKG_GLOBALS.T_BATCHNO)
      
       AS
       VC_SPNAME       PKG_GLOBALS.T_SPNAME; --记录操作表名称
       CUR_ACCOUNT     PKG_GLOBALS.T_CURSOR_REF; --操作游标
       VE_EXCEPTION    EXCEPTION;
    
        TYPE R_ACCOUNT IS RECORD(
          --定义结果集变量 
          --sql查询多少个字段这里就应该有多少个变量
          );
        TYPE  T_R_ACCOUNT IS TABLE OF R_ACCOUNT ;
        VRT_S_ACCOUNT T_R_ACCOUNT;
        VN_NEXT_SK        PKG_GLOBALS.T_NUMBER10;
    
      BEGIN
        OPEN CUR_ACCOUNT FOR
        --执行SQL
    
        LOOP
          FETCH CUR_ACCOUNT BULK COLLECT
            INTO VRT_S_ACCOUNT LIMIT 1000;
          EXIT WHEN VRT_S_ACCOUNT.COUNT = 0;
    
          FOR VN_ROWCOUNT IN 1 .. VRT_S_ACCOUNT.COUNT LOOP
    
        ---处理流程
        --调用结果集变量时编写:VRT_S_ACCOUNT.变量名
          END LOOP;
          COMMIT;
        END LOOP;
        CLOSE CUR_ACCOUNT;
    
      EXCEPTION
        WHEN VE_EXCEPTION THEN
          IF CUR_ACCOUNT%ISOPEN THEN
            CLOSE CUR_ACCOUNT;
          END IF;
          PO_RETMSG := VC_SPNAME || '信息加载失败:' || PO_RETMSG;
          ROLLBACK;
          RETURN;
        WHEN OTHERS THEN
          IF CUR_ACCOUNT%ISOPEN THEN
            CLOSE CUR_ACCOUNT;
          END IF;
          PO_RETCOD := '9000';
          PO_RETMSG := SQLERRM;
          ROLLBACK;
          RETURN;
    
      END PROCEDURE_NAME;

    2. 直接执行的简洁写法(用于自己玩数据的时候)

    declare
      --定义游标并且赋值(is 不能和cursor分开使用)
      cursor cur_1 is select * from table_1;
      --定义rowtype
      cur_stu table_1%rowtype;
      begin
      --开启游标
      for cur_stu in cur_1 loop
       --执行操作sql
       update table t set t.name = cur_1.name where t.number = cur_1.number;
       --结束循环
       end loop;
      --关闭游标
      close stus_cur;
      /*结束执行*/
     end;

    loop循环和for循环原理一致,若采用以下方式开启游标,需注意设置最大循环次数,不然会有一条数据重复循环哦。循环条件 exit when stus_cur%notfound,我理解为for循环中 i <= list.size()。 

    begin
    open cur_1 ;
    --loop循环
     loop
     --循环条件
     exit when stus_cur%notfound;
     --游标值赋值到rowtype
     fetch stus_cur into cur_1;
     --执行操作

    更为简单的写法:

    begin
     for cur_2 in(sql)  --需更新的数据
      loop
      execute immediate 'excutesql'; --执行更新操作
    end loop;
    end;


      

    展开全文
  • 其实直接使用JAVA中的PreparedStatement就可以实现Oracle
    其实直接使用JAVA中的PreparedStatement就可以实现Oracle的增删改查,不过想做一个练手,看看存储过程的JAVA调用到底是如何实现的,所以就写了下面的代码: 
    

    首先是存储过程,接收四个参数,并将其插入数据表中:

    create or replace procedure test (
    v_name varchar2,
    v_password varchar2,
    v_sex varchar2,
    v_address varchar2
    )
    as
    begin
    insert into users values(v_name,v_password,v_sex,v_address,sysdate);
    end test;

    存储过程很简单,在最后还插入了一行系统时间的数据。

    接下来就是JAVA端的调用了:

    //创建存储过程的对象  
    CallableStatement c=conn.prepareCall("{call test(?,?,?,?)}"); 
    //各字段赋值
    c.setString(1, a[0]);
    c.setString(2, a[1]);
    c.setString(3, a[2]);
    c.setString(4, a[3]);
    //执行存储过程  
    c.execute();

    我将四个字段放在一个数组中,然后调用函数给存储过程赋值。

    假设你现在在读一个文件,文件内有四部分内容分别是用户名、密码、性别和地址,要插入数据库,行内间隔用的是tab键,一共很多行,那么就可以这么写代码:

    String [] a=null;
    try {
    	// 读文件
    	StringBuffer sb= new StringBuffer("");
    	FileReader reader = new FileReader("C:\\test.txt");
    	BufferedReader br = new BufferedReader(reader);
    	String str = null;
    
    	while((str = br.readLine()) != null) {
              a= str.split("	"); //这是tab键
              for (int i=0;i<a.length;i++) {
               System.out.println(a[i]);
              }
            //创建存储过程的对象  
            CallableStatement c=conn.prepareCall("{call test(?,?,?,?)}"); 
            //各字段赋值
            c.setString(1, a[0]);
            c.setString(2, a[1]);
            c.setString(3, a[2]);
            c.setString(4, a[3]);
            //执行存储过程  
            c.execute();
    	}
    
    	br.close();
    	reader.close();
    }
    catch(FileNotFoundException e) {
    	e.printStackTrace();
    }
    catch(IOException e) {
    	e.printStackTrace();
    }

    其实可以利用存储过程来读文件的,利用UTL_FILE包中的fopen函数,只不过麻烦一些,不像在JAVA中这么简单。



    展开全文
  • 今天遇到一个难题,Oracle数据库中有一个字段是CLOB类型,java简单解析不了。去查找了一下解决方案,试了好几种,下面的这种是有效的。 public String ClobToString(Clob clob) throws SQLException, IOException { ...

    今天遇到一个难题,Oracle数据库中有一个字段是CLOB类型,java简单解析不了。去查找了一下解决方案,试了好几种,下面的这种是有效的。

        public String ClobToString(Clob clob) throws SQLException, IOException {
    
            String reString = "";
            Reader is = clob.getCharacterStream();// 得到流
            BufferedReader br = new BufferedReader(is);
            String s = br.readLine();
            StringBuffer sb = new StringBuffer();
            while (s != null) {// 执行循环将字符串全部取出付值给StringBuffer由StringBuffer转成STRING
            sb.append(s);
            s = br.readLine();
            }
            reString = sb.toString();
            return reString;
            }
    }

    此处的Clob是java.sql.Clob字段。
    但是我们从数据库中取出的时候是CLOB字段。所以我们需要强制转换一下,在调用该方法的时候:

    String  competitive = ClobToString((Clob)map.get("COMPETITIVEBRAND"));
    展开全文
  • java swing写了一个小工具,可以将数据库中的表直接导成一个Excel2007版本的文件,经过测试最多可以导出120000条左右,和设置的jvm内存大小有关,小批量数据用下还可以,不适合大数据,由于读取表头的sql语句可能...

    突发凌想,用java swing写了一个小工具,可以将数据库中的表直接导成一个Excel2007版本的文件,经过测试最多可以导出120000条左右,和设置的jvm内存大小有关,小批量数据用下还可以,不适合大数据,由于读取表头的sql语句可能和其它数据库不通用,暂时可能只支持Oracle数据库。

    下载地址在文章最后面。

    整体效果:

    先看下效果图:

    工程结构与配置文件:


    部分源码分析:

    源代码部分很简单,分为以下部分:

    1、数据库连接

    此部分略过,properties文件配置  + JDBC都懂。

    2、读取数据

    A:先获取数据表的总列数,

    获取表列名(Excel表头)SQL语句:

    select t1.column_name as fieldName ,t1.data_type as fieldType, t1.data_length as fieldLength,t1.data_precision,t1.nullable as isNull,t1.data_default as data_default,t2.comments as fieldDirections,(select m.constraint_type from user_constraints m,user_cons_columns n where m.constraint_name = n.constraint_name and m.constraint_type='P'and n.column_name = t1.column_name and  n.table_name =t1.table_name) as isPK from user_tab_cols t1 inner join user_col_comments t2 on t2.table_name=t1.table_name and t2.column_name=t1.column_name and t1.table_name='你的表名称'

    B:再获取每次读取的条数,然后就可以封装成一个二维数组,分页循环读取数据。

    // 总行数
    int rowLength = this.getCurrentCount(tableName, startIndex, endIndex);
    // 总列数
    int colLength = tableFields.size();
    		
    // 储存数据,二维数组
    Object [][] tableData = null;
    tableData = new Object[rowLength][colLength];

    3、写入文件

    这部分循环读取数据,然后用POI写入Excel文件,代码很简单,如下:

    	/**
    	 * 写入文件,适用多线程
    	 * @return
    	 * @throws IOException
    	 * @throws InterruptedException
    	 */
    	public String poiWriteFile(){
    		String result = "";
    		String value = null;
    		TableQuery tableQuery = new TableQuery();
    		
    		// 判断数据表是否存在
    		if(!tableQuery.checkExists(tableName)){
    			result = "数据表:"+tableName+" 不存在。";
    		}else{
    			// 获取数据总量
    			int dataCount = tableQuery.getCount(tableName);
    			
    			if(dataCount > DBConfig.getDataUpperLimit()){
    				result = "数据表:"+tableName+" 共"+dataCount+"条数据,超出上限"+DBConfig.getDataUpperLimit()+"条,\n请选择数量较小的表。";
    				return result;
    			}
    			// 记录执行开始时间
    			long startTime = System.currentTimeMillis();
    
    			this.initProgressBar(dataCount);
    			this.setProgress(dataCount, 0);
    			
    			// 计算分页
    			int pageSize = DBConfig.getPageSize();
    			int pageCount = (dataCount  +  pageSize  - 1) / pageSize;
    			
    			// 获取数据表列信息
    			List<TableField> tableFields = tableQuery.getTableField(tableName);
    			
    			XSSFWorkbook workBook = new XSSFWorkbook();
    			XSSFSheet sheet = workBook.createSheet(tableName);	// 创建一个工作薄对象
    			
    			XSSFRow row;				// 创建一个行对象
    			int rowIndex = 0;			// 当前行下标
    
    			XSSFCell cell;				// 创建单元格
    			
    			// 写文件头(Excel的第一行)
    			row = sheet.createRow(rowIndex);
    			for(int h = 0; h < tableFields.size(); h++){
    				cell = row.createCell(h);
    				cell.setCellValue(tableFields.get(h).getName());
    			}
    			rowIndex ++;
    			
    			// 分页读取数据,写入文件
    			for(int page = 1; page <= pageCount; page ++){
    				int startIndex = (page-1)*pageSize;
    				int endIndex = page*pageSize;
    				Object [][] tableData = tableQuery.getTableData(tableName, tableFields, startIndex, endIndex);
    				/* 
    				if(page != 1){		// 分批次追加文件
    					FileInputStream is = new FileInputStream(saveFile);	// 读取上次创建的文件
    					workBook = new XSSFWorkbook(is);
    					sheet = workBook.getSheet(tableName);
    				}
    				*/
    				for(int i = 0; i < tableData.length; i++){
    					row = sheet.createRow(rowIndex);
    					
    					for(int j = 0; j < tableFields.size(); j++){
    						cell = row.createCell(j);
    
    						if(tableData[i][j] != null){
    							value = tableData[i][j].toString();
    							
    							if(tableFields.get(j).getType().equalsIgnoreCase("NUMBER")){
    								cell.setCellType(XSSFCell.CELL_TYPE_NUMERIC);
    								cell.setCellValue(Double.parseDouble(value));
    							}else{
    								cell.setCellType(XSSFCell.CELL_TYPE_STRING);
    								cell.setCellValue(value);
    							}
    						}
    					}
    					rowIndex ++;
    					this.setProgress(dataCount, rowIndex);
    				}
    				/*
    				// 写文件,分批次追加
    				FileOutputStream os = new FileOutputStream(file);
    				// 将文档对象写入文件输出流
    				workBook.write(os);
    				// 关闭文件输出流
    				os.close();
    				*/
    				
    				//System.out.println("已经导出:"+rowIndex+" 条。");
    				System.gc();
    			}
    			
    			if(frame != null){
    				frame.setProgressBarLabel("数据导出完毕,正在生成文件……");
    			}
    			
    			String fileOk = "文件生成失败!";
    			// 写文件
    			try {
    				FileOutputStream os = new FileOutputStream(saveFile);
    				// 将文档对象写入文件输出流
    				workBook.write(os);
    				// 关闭文件输出流
    				os.close();
    				fileOk = "文件生成完毕!";
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    
    			String expOk = "失败!";
    			if(fileOk.equalsIgnoreCase("文件生成完毕!")){
    				expOk = "成功!";
    			}
    			
    			// 记录执行结束时间
    			long endTime = System.currentTimeMillis();
    			// 计算执行历时时间
    			long timeDifference = (endTime - startTime)/(1000);
    			result = "导出"+expOk+"\n历时:"+timeDifference+" 秒";
    
    			System.out.println(result);
    			
    			if(frame != null){
    				frame.setProgressBarLabel(fileOk);
    			}
    		}
    		return result;
    	}

    分页读取数据时,把数据全部写入XSSFWorkbook,再生成文件。若没读取一次数据就保存文件,以后每次都以追加的形式写入文件,效率低得很。


    4、Java Swing UI

    UI是用NetBeans画的,很简单,没什么技术含量,有兴趣的可以看下关键部分源代码,NetBeans自动生成的那部分就不要看了。

    demo下载地址:

    下载文件压缩包内含源代码与编译后的文件

    CSDN地址:http://download.csdn.net/detail/u010019941/7674735

    百度网盘地址:http://pan.baidu.com/s/1pJJkgrD


    POI下载地址:http://poi.apache.org/download.html 官方当前最新版3.11

    展开全文
  • Java实现使用Mybatis将数据批量插入到Oracle数据库,并且可以使用Oracle序列来生成主键
  • 片文章介绍了一个Java批量添加数据,多个字段同时添加多条数据具体实例,面向的是Oracle数据库,需要的朋友可以参考下
  • 本实例做的是读取execl...还需要说明是对execl的读取java可以通过横坐标和纵坐标读取到execl的每个单元格, 根据个人情况看需要读取execl表格中的那些内容,下面这个代码是通用的读取execl的代码 for (int numSheet
  • java操作oracle数据库

    千次阅读 2012-07-27 20:45:59
    最近看韩顺平老师的视频,记下java是如何操作oracle的。 环境:windows xp  eclipse 4.2  oracle 10.2.0 操作方式: 一.通过ODBC连接oracle 1.先配置ODBC数据源:   测试连接成功后: 2.打开eclipse,...
  • oracle数据匹配merge into

    万次阅读 2016-02-04 11:04:49
    Oracle数据同步,merge into使用,minus匹配差异数据
  • 导出oracle数据到EXCEL(JAVA编写)

    千次阅读 2015-09-06 10:25:24
    1.在Oracle数据库中,我将数据通过存储过程都插到了一张表里面,这张表是在正式库里面的,所有操作都做我本地数据库中进行,用dblink连接正式库; 2.在我本地数据库建这么一张表t_table_to_excel cr
  • 应该不是程序的问题,跟机器的配置应该也没有多大的关系,同样的war包, 在服务器部署之后for循环查询很慢很慢(整个循环下来大概需要30-60秒),而我在自己电脑 上测试发现for循环查询...是不是跟oracle 有关系?
  • java连接Oracle数据库

    万次阅读 多人点赞 2018-10-26 11:33:57
    连接数据库有多种方式,对于初学者连接数据库,这里介绍两种方法及两种连接...oracle驱动包可以在Oracle安装位置找到,也可以自己去下载 路径就是 app\计算机用户名\product\11.2.0\dbhome_1\jdbc\lib mysql驱动包...
  • oracle中批量插入10000条数据,报错如下java.lang.StackOverflowError at java.util.HashMap.hash(HashMap.java:362) at java.util.HashMap.getEntry(HashMap.java:462) at java.util.HashMap.get(HashMap.java:...
  • Access数据迁移到Oraclejava代码

    千次阅读 2012-09-14 16:02:41
    项目比较紧张,写了一个小工具,目的是能够快速的将Access的数据迁移到Oracle平台下,没有重构,没有优化,纯原生态,估计会有各种错误,但是基本的思路在。 1)需要配置Access的数据源 2)需要导入Oracle支持的jar包 ...
  • http://docs.oracle.com/cd/E11882_01/java.112/e16548/oralob.htm#JJDBC28534 if (type.equalsIgnoreCase("CLOB")) { String result =resultSet.getString(columnIndex); System.out.println("getString方法...
  • 本文以Loadrunner的Java_Vuser脚本为例,来做一个简化版的自动化测试框架(以excel作为数据驱动),实现批量更新Oracle业务数据库的目的,通过本文例子我们还可以实现将Loadrunner由性能测试工具,转换成一个接口...
  • mybatis 批量新增并更新ORACLE已有数据

    千次阅读 2018-02-08 14:57:19
    工作中有一个功能需求,需要调用对方接口得到数据更新到数据库中。在网上找了好多没找到有现成的东西,都是单独的批量更新,批量新增。需求要求进行批量处理的时候无则新增,有则更新。 一开始使用的是调用存储...
  • Oracle 10g中测试,结果:  1.使用statement 耗时142秒;  2.使用PreparedStatement 耗时56秒;  3.使用PreparedStatement + 批处理耗时:   a.50条插入一次,耗时5秒;    b.100条插入一次,耗时2秒;  ...
  • //以下功能为:查询数据库用户中所有的表名 try { rs = stmt.executeQuery("select table_name,column_name from user_tab_columns where data_type /BLOB/"); while(rs.next()) { tabName = rs.getString(...
  •  2.Java连接成功,但是while循环里面就是查询不出数据来的问题。   1 首先:登录pl/sql,选择system 连接为normal.  如果你的没有“连接为”,那是因为还有一个没有配置好,配置好后就会显示出来
  • Class.forName("oracle.jdbc.driver.OracleDriver"); } catch (ClassNotFoundException e) { e.printStackTrace(); } //创建一个连接 try { conn = DriverManager.getConnection(url, userName, ...
  • 这种数据量建议采用原生JDBC进行处理,通过PreparedStatement+批量提交的方式,具体代码如下: /** * <b>文件名:</b>Demo4.java<br> * <b>描述:</b><br> * <b>...
  • Oracle恢复数据

    千次阅读 2017-09-29 11:52:33
    ORACLE恢复数据 ORACLE恢复删除表或表记录 一:表的恢复 对误删的表,只要没有使用PURGE永久删除选项,那么从flash back区恢复回来希望是挺大的。一般步骤有: 1、从flash back里查询被删除的表 select * from ...
  • java txt导入oracle数据库 date处理

    千次阅读 2017-10-12 17:54:08
    1. 自己太菜,基本的东西搞的自己团团转,谨记。 原因: 在导入txt到表中,一直提示不对应。经过百度,是因为oracle数据库的date在存储的时候需要格式化一下。
  • excel导出数据到数据库(oracle),当数据库中的数据有上万条时,如何进行批量操作 这里我用的分批操作,直接上代码: private void createBatchList(List<Map<String, Object>> list){//这个list就是批量...
  • oracle使用for循环插入10000条数据

    万次阅读 2018-06-26 18:32:29
    转自:https://blog.csdn.net/snowfoxmonitor/article/details/50086811点击打开链接 SQL&gt;createtable t( xint, y char(50));   Table created.   SQL&gt; SQL&... ...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 46,096
精华内容 18,438
关键字:

java循环更新oracle数据

java 订阅