`
zhao103804
  • 浏览: 124589 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

使用JDBC批量修改Oracle序列步长

 
阅读更多

场景

数据迁移完成后需要对库中序列进行重置,。

方法

三种常见方式

删除--重建

这种方式下简单的序列重建会影响业务逻辑处理无法适应原有序列参数规则不一致的情况,但如果序列参数一致的情况下此种办法比较简单还有效率。

临时修改序列步长,而后还原(PL/SQL采用此种方式)

这种方式通过先修改序列步长然后通过NEXTVAL自增序列得到目标值,最后再将序列步长还原为原始值,如下SQL

  1. ALTER SEQUENCE SEQ_ACCOUNT_BALANCE INCREMENT BY 1000;  
  2. SELECT SEQ_ACCOUNT_BALANCE.NEXTVAL FROM DUAL;  
  3. ALTER SEQUENCE SEQ_ACCOUNT_BALANCE INCREMENT BY 1; 
  4. 在修改某个具体序列时经常使用此方法,但如果批量操作序列则操作步骤较上一步要多了一步。

    循环递增序列值

    这种办法非常安全但低效率,如下SQL:

  5. FOR I IN 1 .. 1000 LOOP  
  6. SELECT SEQ_ACC_ID.NEXTVAL INTO SAI FROM DUAL;  
  7. END LOOP; 

 

本人项目需求:

迁移数据,序列的初始值为数据表中序列对应主键ID的最大值。由于表和序列没有关联,本人将表、序列和主键值对应在配置文件中。如图:


主键ID,序列和表字段封装到一个实体类中,则读取出来存放到List中。

将List的值转变成执行的SQL语句,在此,一个序列改变初始值,则删除序列和创建序列同时执行,我是将执行一个序列的这两个语句放在数组里,则多个序列则存数组的集合

Controller.java

//start 改变序列的初始值

try {

//获取数据

List<SequenceMessage> seqmessageList = ParseXml.getSequenceList();

Map<String, List<String>> resultmap = baseservice.doWork(seqmessageList);

 

logsb.append("序列初始值改变<BR>总共序列个数"+seqmessageList.size()+"<br>");

 

 

List<String> falseResult = resultmap.get("false");

List<String> trueResult = resultmap.get("true");

logsb.append("执行序列错误有"+falseResult.size()+"个,执行序列正确有"+trueResult.size()+"个,无数据表"+(seqmessageList.size()-falseResult.size()-trueResult.size())+"<br>");

 

if(falseResult.size() > 0){

logsb.append("失败执行语句以下有:<br>");

for (int i = 0; i < falseResult.size(); i++) {

logsb.append(falseResult.get(i)+"<br>");

}

}

if(trueResult.size() >0){

logsb.append("正确执行语句以下有:<br>");

for (int i = 0; i < trueResult.size(); i++) {

logsb.append(trueResult.get(i)+"<br>");

}

}

 

 

} catch (Exception e) {

logsb.append("改变序列初始值发生异常:"+e.toString()+"<br><br>");

e.printStackTrace();

}

baseservice.java

public Map<String, List<String>> doWork(List<SequenceMessage> seqmessageList){

Connection conn = getConnection();

Map<String, List<String>> resultmap = new HashMap<String, List<String>>();

List<String> falseResult = new ArrayList<String>();

List<String> trueResult = new ArrayList<String>();

 

//start 获取表和序列和字段之间的关系

List<String[]> seqDDLArray = new ArrayList<String[]>();

for (int i = 0; i < seqmessageList.size(); i++) {

SequenceMessage seqmsg = seqmessageList.get(i);

String id = seqmsg.getId();

String tname = seqmsg.getTablename();

String seqname = seqmsg.getSeqname();

String maxsql = "select max(" + id + ") from " + tname;

// 执行根据该主键ID获取该对应表中的最大值

Object[] obj = null;

try {

obj = (Object[]) basedao.queryForArrayList(maxsql).get(0);

String objstr = obj[0] + "";

if (!"null".equals(objstr)) {

seqDDLArray.add(rebuildSEQ(seqname,Integer.parseInt(objstr)));

}

} catch (Exception e) {

e.printStackTrace();

falseResult.add(e.toString());

continue;

}

 

}

 

//start 循环执行删除序列和创建序列

for (int i = 0; i < seqDDLArray.size(); i++) {

//同一个序列  删除和创建同时执行

String[] sqlattr=seqDDLArray.get(i);

try {

boolean flag =basedao.updateBatch(sqlattr, conn);

if(!flag){

for (int j = 0; j <sqlattr.length; j++) {

falseResult.add(sqlattr[j]);

}

}else{

for (int j = 0; j <sqlattr.length; j++) {

trueResult.add(sqlattr[j]);

}

}

} catch (Exception e) {

e.printStackTrace();

continue;

}

 

}

 

resultmap.put("false", falseResult);

resultmap.put("true", trueResult);

DbUtils.closeQuietly(conn);

return resultmap;

}

 basedao.java

/**

* 执行批量

* @param sqlArray

* @throws SQLException

*/

public boolean updateBatch(String[] sqlArray, Connection conn)

throws SQLException {

boolean flag = false;

 

conn.setAutoCommit(false);

Statement stmt = conn.createStatement(ResultSet.TYPE_FORWARD_ONLY,

ResultSet.CONCUR_READ_ONLY);

for (String tmpSql : sqlArray) {

stmt.addBatch(tmpSql);

}

int[] rtnArr = stmt.executeBatch();

conn.commit();

if (rtnArr.length > 0) {

flag = true;

}

 

return flag;

 

}

 

返回类型是由于我需求是要将后台代码返回给前端展示,就直接在后台拼接代码了。代码应该可以看懂

我这个代码是执行一个序列的操作不成功,继续走下一步,错误和正确执行的返回给客户端展示

界面就不展示了

 

参照http://blog.csdn.net/a316212802/article/details/40297115

  • 大小: 9.3 KB
分享到:
评论

相关推荐

    JDBC批量插入 更新 删除等操作

    #### 四、JDBC批量修改 **批量修改**实际上指的是批量更新操作,因为它涉及到对数据库中已有数据的修改。 #### 总结 综上所述,JDBC的批量操作包括批量插入、批量更新、批量删除等,它们都依赖于`...

    Flink JDBC Connector 支持Oracle

    Flink JDBC Connector 支持Oracle , Flink 1.13.6 支持Oracle 11.2.0.4

    Java使用Jdbc连接Oracle执行简单查询操作示例

    Java使用Jdbc连接Oracle执行简单查询操作示例 Java使用Jdbc连接Oracle执行简单查询操作,是指使用Java语言通过Jdbc(Java Database Connectivity)连接Oracle数据库并执行简单查询操作的过程。本文将通过实例形式...

    jdbc批量插入大字段

    1. **连接数据库**:使用`DriverManager.getConnection()`方法建立与Oracle数据库的连接,确保已加载对应的JDBC驱动(如ojdbc)。 2. **创建PreparedStatement**:预编译SQL插入语句,例如`INSERT INTO table_name ...

    Java用JDBC实现对Oracle数据库操作

    JDBC是Java中用于与各种数据库通信的标准接口,而Oracle数据库是一个广泛使用的商业关系型数据库系统。在这个主题中,我们将深入探讨以下几个关键知识点: 1. **JDBC驱动**: 在Java中与Oracle数据库交互,首先需要...

    Oracle12C JDBC 驱动

    Oracle12C JDBC驱动还支持高级特性,如分布式事务处理、批量操作、预编译的SQL语句、游标、存储过程调用、连接池管理等。此外,通过`oracle.jdbc.pool.OracleDataSource` 类可以实现连接池功能,如使用Oracle的...

    oracle12 jdbc驱动包

    此外,Oracle 12c JDBC驱动还支持高级特性,如分布式事务处理、JNDI查找、连接池管理、数据源支持、以及SQL的高级功能,如批量处理、存储过程调用、游标处理等。对于大型企业级应用,这些特性尤其重要,它们能确保...

    oracle.jdbc.driver.oracledriver Oracle JDBC驱动包 ojdbc6

    Oracle JDBC驱动包是Oracle数据库与Java应用程序之间进行通信的关键组件,它使得Java程序员能够通过编写Java代码来操作Oracle数据库。标题中的"ojdbc6"指的是Oracle JDBC驱动的一个特定版本,适用于Java SE 6环境。...

    使用JDBC连接Oracle数据库

    ### 使用JDBC连接Oracle数据库 #### 一、简介与背景 Java Database Connectivity (JDBC) 是 Java 开发语言中的一项关键技术,它允许开发者通过标准 API 与多种类型的数据库进行交互。JDBC 提供了一种机制,使 Java...

    ORACLE的JDBC JAR包

    ORACLE的JDBC JAR包ORACLE的JDBC JAR包ORACLE的JDBC JAR包ORACLE的JDBC JAR包

    Mybatis与JDBC批量插入MySQL数据库性能测试

    代码部分包含了使用JDBC和Mybatis进行批量插入的示例,你可以直接运行这些代码进行测试。同时,数据库脚本和初始数据也在其中,确保了测试的一致性和可重复性。 通过这样的性能测试,我们可以了解到在特定场景下,...

    可用于oracle19c的jdbc驱动

    Oracle JDBC驱动是Oracle数据库与Java应用程序之间通信的重要桥梁。标题提到的"可用于Oracle19c的JDBC驱动"指的是Oracle公司为19c版本数据库提供的Java Database Connectivity (JDBC)驱动程序,它允许Java应用程序...

    Jdbc.zip_JDBC程序_oracle_oracle jdbc

    标题中的“Jdbc.zip_JDBC程序_oracle_oracle jdbc”表明这是一个关于使用Java数据库连接(JDBC)与Oracle数据库交互的程序示例。在描述中提到,“一段Jdbc连Oracle的程序,并实现数据查询”,这暗示我们将探讨如何...

    JDBC的批量处理语句

    JDBC 批量处理语句是指使用 JDBC 连接数据库时,批量执行 SQL 语句的方法。这种方法可以大大提高更新处理速度,减少数据库访问次数,提高应用程序的性能。 在 JDBC 中,批量处理语句包括两个方法:addBatch(String)...

    Oracle12C驱动包JDBC

    Oracle 12C JDBC驱动包是Oracle数据库与Java应用程序之间的桥梁,它允许Java开发者通过编写Java代码来访问和操作Oracle数据库。JDBC(Java Database Connectivity)是Java平台的标准API,用于连接各种数据库,包括...

    jdbc--drivers.zip_ jdbc oracle_JDBC ORACLE_oracle

    标题中的"jdbc--drivers.zip_ jdbc oracle_JDBC ORACLE_oracle"表明这是一个关于JDBC驱动程序的压缩包,特别关注的是Oracle数据库的JDBC驱动。JDBC,全称Java Database Connectivity,是Java语言中用于与各种数据库...

    jdbc批量 (绝对经典)

    除了使用标准的JDBC API进行批量处理外,还可以利用数据库自身的特性,如存储过程,来进行更高效的批量操作。存储过程是在数据库端预编译并存储的一系列SQL语句或命令,它们可以接受参数,执行复杂的逻辑,并返回...

    java使用jdbc连接oracle数据库

    Java使用JDBC(Java Database Connectivity)来连接Oracle数据库是一个常见的任务,它允许Java应用程序与各种数据库进行交互。在本场景中,`ojdbc6.jar`是Oracle提供的JDBC驱动程序,用于建立Java应用程序与Oracle...

    jdbc-oracle-thinjdbc-oracle-thin

    ### JDBC-Oracle-Thin 驱动介绍与配置详解 #### 一、JDBC-Oracle-Thin 概述 在数据库连接技术中,Java Database Connectivity ...希望这些信息能够帮助你在使用 JDBC-Oracle-Thin 连接 Oracle 数据库时更加得心应手。

    Jdbc连接oracle远程数据库中文乱码解决

    本文将深入探讨如何通过JDBC(Java Database Connectivity)连接Oracle远程数据库时,解决中文乱码的困扰。 首先,我们需要理解的是,中文乱码通常源于字符集不一致或配置不当。在Java应用中,数据在JVM(Java...

Global site tag (gtag.js) - Google Analytics