Oracle一次获取多个序列值

【AI黑话日日新】什么是AI Infra? 是支撑AI模型开发、训练、推理、部署与规模化运营的,是连接底层算力与上层AI应用的“数字基建”。没有高效的AI Infra,大模型训练、推理与落地都无法高效实现。 阅读详情

SQL 语句一次获取多个序列值

获取序列中的多个值

创建序列

CREATE SEQUENCE test_user_seq;

获取一个序列值

SELECT test_user_seq.nextval FROM dual;

在这里插入图片描述
有一个比较传统的方法构造多行数据,就是使用union all

SELECT 1 FROM DUAL
UNION ALL
SELECT 1 FROM DUAL

在这里插入图片描述
生成多行数据的方法有了,那么一次生成多个序列的方法也有了

SELECT test_user_seq.nextval 
FROM (
SELECT 1 FROM DUAL
UNION ALL
SELECT 1 FROM DUAL)

在这里插入图片描述
综上所述,一次获取多个序列值需要生成多行数据

connect by level 生成多行数据

union all 生成多行数据这个方法,性能比较差,当需要的序列比较多的时候,SQL 比较长,数据库解析SQL 耗时也多,而且还需要拼接sql, 使用
connect by level 生成多行数据就比较方便

select level from dual connect by level <= 5;

在这里插入图片描述
一次生成了5行数据,那么就可以用这个方式,获取5个序列值

SELECT test_user_seq.nextval FROM (
select level from dual connect by level <= 5
);

在这里插入图片描述
需要生成几个序列值,修改一下 level 的数量就可以,非常简洁

JDBC 一次获取多个序列值

安装 驱动jar 包到本地仓库

  1. 查看Oracle 安装目录的驱动路径
    在这里插入图片描述
  2. maven 命令安装驱动jar到本地仓库
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc8 -Dversion=19.0.0.0.0 -Dpackaging=jar -Dfile=H:\Oracle\19c\jdbc\lib\ojdbc8.jar
  1. 获取多个序列值
import org.junit.Test;
import java.sql.*;
import java.util.Properties;

public class OracleJdbc {

    private static final String driver = "oracle.jdbc.driver.OracleDriver";

    private static final String url = "jdbc:oracle:thin:@localhost:1521/TEST";

    private static final String userName = "TEST_USER";

    private static final String password = "TEST_USER";

    static {
        // 加载驱动
        try {
            Class.forName(driver);
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        }
    }

    public Connection createConnection(String url, String userName, String password) {
        Connection connection = null;
        try {
            connection = DriverManager.getConnection(url, userName, password);
        } catch (SQLException e) {
            e.printStackTrace();
        }
        return connection;
    }

    @Test
    public void testConnection() {
        Connection connection = createConnection(url, userName, password);
        try {
            Properties properties = connection.getClientInfo();
            System.out.println(properties);
            System.out.println(connection.getSchema());
        } catch (SQLException e) {
            e.printStackTrace();
        } finally {
            try {
                connection.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }
    }

    @Test
    public void testTestBatchSequence() {
        try (Connection connection = createConnection(url, userName, password)) {
            String sql = "SELECT test_user_seq.nextval FROM (select level from dual connect by level <= ?)";
            PreparedStatement preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setInt(1, 5);
            ResultSet resultSet = preparedStatement.executeQuery();
            while (resultSet.next()) {
                System.out.println(resultSet.getInt(1));
            }
        } catch (SQLException e) {
            e.printStackTrace();
        }
    }
}
  1. 运行 testTestBatchSequence,结果如下
48
49
50
51
52

MyBatis 一次获取多个序列值

  1. 配置文件 mybatis-config-oracle.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!--

       Copyright 2009-2017 the original author or authors.

       Licensed under the Apache License, Version 2.0 (the "License");
       you may not use this file except in compliance with the License.
       You may obtain a copy of the License at

          http://www.apache.org/licenses/LICENSE-2.0

       Unless required by applicable law or agreed to in writing, software
       distributed under the License is distributed on an "AS IS" BASIS,
       WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
       See the License for the specific language governing permissions and
       limitations under the License.

-->
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">

<configuration>

    <!-- autoMappingBehavior should be set in each test case -->
    <properties resource="templates/oracle-db.properties"/>

    <environments default="development">
        <environment id="development">
            <transactionManager type="JDBC">
                <property name="" value=""/>
            </transactionManager>
            <dataSource type="POOLED">
                <property name="driver" value="${driverClassName}"/>
                <property name="url" value="${jdbcUrl}"/>
                <property name="username" value="${username}"/>
                <property name="password" value="${password}"/>
            </dataSource>
        </environment>
    </environments>

    <mappers>
        <mapper resource="mapper/OracleBatchSeqMapper.xml"/>
    </mappers>

</configuration>
  1. Mapper 配置文件 OracleBatchSeqMapper.xml
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd" >
<mapper namespace="com.scd.mapper.OracleBatchSeqMapper">
    <select id="getBatchSeqId" resultType="java.lang.Long">
        SELECT test_user_seq.nextval FROM (select level from dual connect by level <![CDATA[ <= ]]> #{param})
    </select>
</mapper>
  1. 数据库配置文件 oracle-db.properties
driverClassName=oracle.jdbc.driver.OracleDriver
jdbcUrl=jdbc:oracle:thin:@localhost:1521/TEST
username=TEST_USER
password=TEST_USER
  1. 测试代码
import com.scd.mapper.OracleBatchSeqMapper;
import com.scd.mapper.TestUserMapper;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import org.junit.Assert;
import org.junit.Before;
import org.junit.Test;

import java.io.Reader;
import java.util.List;

public class BatchSeqIdTest {

    private SqlSessionFactory sqlSessionFactory;

    @Before
    public void setUp() throws Exception {
        String resource = "templates/mybatis-config-oracle.xml";
        Reader reader = Resources.getResourceAsReader(resource);
        sqlSessionFactory = new SqlSessionFactoryBuilder().build(reader);
    }

    @Test
    public void testBatch() {
        try (SqlSession sqlSession = sqlSessionFactory.openSession()) {
            OracleBatchSeqMapper oracleBatchSeqMapper = sqlSession.getMapper(OracleBatchSeqMapper.class);
            List<Long> idList = oracleBatchSeqMapper.getBatchSeqId(5);
            System.out.println(idList);
            Assert.assertEquals(5, idList.size());
        }
    }
}
  1. 执行 testBatch 测试方法,运行结果如下
19:54:46.840 [main] DEBUG org.apache.ibatis.logging.LogFactory - Logging initialized using 'class org.apache.ibatis.logging.slf4j.Slf4jImpl' adapter.
19:54:46.867 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
19:54:46.867 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
19:54:46.867 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
19:54:46.867 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - PooledDataSource forcefully closed/removed all connections.
19:54:46.969 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Opening JDBC Connection
19:54:47.971 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Created connection 1766505436.
19:54:47.971 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Setting autocommit to false on JDBC Connection [oracle.jdbc.driver.T4CConnection@694abbdc]
19:54:47.975 [main] DEBUG com.scd.mapper.OracleBatchSeqMapper.getBatchSeqId - ==>  Preparing: SELECT test_user_seq.nextval FROM (select level from dual connect by level <= ?)
19:54:48.120 [main] DEBUG com.scd.mapper.OracleBatchSeqMapper.getBatchSeqId - ==> Parameters: 5(Integer)
19:54:48.209 [main] DEBUG com.scd.mapper.OracleBatchSeqMapper.getBatchSeqId - <==      Total: 5
[53, 54, 55, 56, 57]
19:54:48.210 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Resetting autocommit to true on JDBC Connection [oracle.jdbc.driver.T4CConnection@694abbdc]
19:54:48.210 [main] DEBUG org.apache.ibatis.transaction.jdbc.JdbcTransaction - Closing JDBC Connection [oracle.jdbc.driver.T4CConnection@694abbdc]
19:54:48.210 [main] DEBUG org.apache.ibatis.datasource.pooled.PooledDataSource - Returned connection 1766505436 to pool.
智能手表 BOM 表与版本管理记录 试产与量产阶段 智能手表 BOM 表与版本管理记录 阅读详情

相关推荐

《最游记》游戏开发全栈指南:从源码解析到实战部署

本文提供了一份详尽的《最游记》游戏源码全栈开发指南。文章深入解析了这款3D玄幻网游的完整源码结构,涵盖客户端、服务端、引擎和工具链,并提供了从环境搭建、核心模块解析到实战修改与部署的完整流程。对于希望深入理解MMORPG架构的开发者而言,这份指南是宝贵的实战资源。

weixin_28363123的博客 71

Mybatis Plus批量插入获取序列值回写主键优化(Oracle)

写工具类或者全局的方法就需要考虑的更多,对开发技术和思想要求更高,同时逼迫自己阅读更多的阅读源码。

sbcsdn111的博客 3869

从零到一:如何用YOLOv8和PyQt5打造一个高效的路面坑洞检测系统

本文详细介绍了如何利用YOLOv8和PyQt5开发一个高效的路面坑洞检测系统。从环境配置、数据采集标注到模型训练优化,再到PyQt5界面开发与系统集成,提供了完整的实战指南。该系统结合深度学习技术,显著提升了道路检测的准确性和效率,适用于各类道路维护场景。

weixin_29047919的博客 308

oracle 获取多个序列值,一次性获取多个oracle序列值问题

假设场景:A与B表是一对多关系,现在多个A和多个B进行批量入库。A的主键用某个序列JOB_SEQUENCE.nextval,B表的外键字段存A表的主键。如果A和B在同一个事务保存里,应该怎么操作呢?之前的做法是:public static int newMeasurementJobId(IntHolder jobId) {Connection conn = getConnection();if (...

weixin_30856775的博客 567

Palabos User Guide中文解读 | 第五章 | Palabos编程 (跳过了第四章Palabos-Java接口)

作者的话:本人在学习palabos时,发现国内中文资料甚少,恰好网上可以直接搜到palabos user guide这种英文资料,加之时间充裕,便打算开始翻译,翻了一节后发现这可能算侵权,就比较伤脑筋,突然想到自己写中文解读即可,便有了下面的博客。 Palabos User Guide Release 1.0 r1 Copyright © 2019 University of Geneva Jul...

Yulan Fang's notes. 2298

WRF-CHEM 新手向实践(四):化学初始/边界场及namelist设置

这是这个系列的最后一节了,这些经验是自己作为一个半路出家的外行一步步摸索出来的,其中不免有很多理解不到位的地方,但也正是如此,我相信这是目前新手入门wrf-chem最友好的教程之一,希望能对大家有实质性的帮助。本节继续未完成的内容。在mozbc生成化学初始和边界条件之前,还需要先在wrfinput文件中开启化学部分。

qq_42335815的博客 4636

一次性获取多个oracle序列的值,实现关联表多数据的批量insert

业务 要求批量导入不小于10W条数据到 user 表,但是user表在 insert 每条数据的同时要 insert 一条对应数据到 customer表, 并且是以 customer 表的主键作为 user 表的外键。 所以想到要一次性获取多个 序列值,再把对应的序列给不同表,并分别作为两个表的主键和外键的值。 方法很简单 就一句代码 : String squ

愿我如星君如月 ... 夜夜流光相皎洁 ... 4223

开源CMDB与资产管理平台对比报告

本文对比分析了9款主流开源CMDB平台,从集成能力、功能完整性和多语言支持三个维度进行评测。重点介绍了VeCMDB、蓝鲸CMDB、WeCMDB和OpsAny等国产平台的特色:VeCMDB以动态模型和自动发现见长;蓝鲸CMDB适合超大规模企业级应用;WeCMDB专注金融级高并发场景;OpsAny提供一体化运维解决方案。针对不同规模企业给出选型建议:中小团队推荐Snipe-IT等轻量工具;大型企业建议蓝鲸或WeCMDB;需国产化适配的可选VeCMDB或OpsAny。文章还特别指出iTop、GLPI等适合ITIL

huang0612123的博客 1080

一次性获取多个oracle序列值问题

假设场景:A与B表是一对多关系,现在多个A和多个B进行批量入库。 A的主键用某个序列JOB_SEQUENCE.nextval,B表的外键字段存A表的主键。 如果A和B在同一个事务保存里,应该怎么操作呢? 之前的做法是: public static int newMeasurementJobId(IntHolder jobId) { Connection conn =

1万+

风机叶片小规模振动监测数据集--读取测试

ETH风电叶片缺陷数据集–读取测试 数据简介 提示:这里可以添加本文要记录的大概内容: 结构健康监测是保障重要机电设备、建筑设施健康的重要技术手段。 一、lvm_read包安装 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务

cnjs1994的博客 2850

innovus:insert Power Switch失败,报告not covered by a row问题解析

这个问题就是switch找不到可以放置的row,分析就从两方面入手,一方面从voltage area下手,一方面从row和site入手。检查发现voltage area设置正确,row也存在,只不过lef里缺少对应switch的双倍高的site。更多学习内容请关注「拾陆楼」知识星球。

m0_61544122的博客 1159

一次获取多个oracle序列值

一次获取多个oracle序列值 学习了:http://blog.youkuaiyun.com/wangchsh2008/article/details/53495961 select seq_one.nextval from (select 1 from one_large_table where rownum&lt;10)  

weixin_34112208的博客 1756

【CANoe示例分析】SOMEIPWithvCDL_16

本示例来源于官方提供的示例工程:0004_基于vCDL实现SOMEIP通信_Demo\0004_基于vCDL实现SOMEIP通信_Demo\SOMEIPWithvCDL。

jasonj333 567

Oracle一次查出多个序列值,一次性获取多个oracle序列的值,实现关联表多数据的批量insert...

maven/Java/web/bootstrap/dataTable/app开发QQ群:566862629。希望更多人一起帮助我学习。业务 要求批量导入不小于10W条数据到 user 表,但是user表在 insert 每条数据的同时要 insert 一条对应数据到 customer表,并且是以 customer 表的主键作为 user 表的外键。所以想到要一次性获取多个 序列值,再把对...

weixin_31759829的博客 1524

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

oracle一次取多个序列,一次性獲取多個oracle序列的值,實現關聯表多數據的批量insert...

maven/Java/web/bootstrap/dataTable/app開發QQ群:566862629。希望更多人一起幫助我學習。業務 要求批量導入不小於10W條數據到 user 表,但是user表在 insert 每條數據的同時要 insert 一條對應數據到 customer表,並且是以 customer 表的主鍵作為 user 表的外鍵。所以想到要一次性獲取多個 序列值,再把對...

weixin_39968823的博客 544

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

oracle序列会被锁表吗,oracle账号已被锁定一次性获取多个oracle序列的值,实现关联表多数据的批量insert...

业务 要求批量导入不小于10W条数据到 user 表,但是user表在 insert 每条数据的同时要 insert 一条对应数据到 customer表,并且是以 customer 表的主键作为 user 表的外键。所以想到要一次性获取多个 序列值,再把对应的序列给不同表,并分别作为两个表的主键和外键的值。方法很简单 就一句代码 :String squence ="select USR_CUSTO...

weixin_39636987的博客 312

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

oracle 获取多个序列值,sql-如何将多个带有序列值的行插入到oracle中?

sql-如何将多个带有序列值的行插入到oracle中?我知道,如果我在此答案中使用语法,则可以使用单个语句插入多行。但是,我要插入的值之一是从一个序列中获取的,即insert into TABLE_NAME(COL1,COL2)select MY_SEQ.nextval,'some value' from dualunion allselect MY_SEQ.nextval,'another va...

weixin_35942339的博客 213

Oracle获取序列值

一、Sql直接读取 select 'SeqName'.NEXTVAL from dual 二、Func函数 create or replace function GetSequenceFunc( seqName in char) return int AS sqlstr varchar(100); seqValue number(20); begin sqlstr := 'select '||seqName||'.nextval from dual

czjnoe的博客 4125

Oracle在Mybatis中获取序列的值

Mapper 传入序列名称获取,这里使用$符号拼接 <select id="getSeqByName" parameterType="string" resultType="long"> SELECT ${value}.nextval FROM DUAL </select> java mapper 接口接收序列名称 Long getSeqByName(@Param("value") String value); server 使用方法 Long i

X_ABU的博客 1256

oracle如何设置序列当前值

oracle 改变序列当前值 序列好象不能直接修改当前值。 方法: 做个循环select, 或者重建这个序列, 或者修改这个序列的increment,然后做一次select,然后再把increment 修改回来。 修改这个序列的increment,然后做一次select,然后再把increment 修改回来:

haiross的专栏 4万+

oracle中如何获取序列的当前值

select 序列名.currval from dual;  //获取序列的当前值,这个值是可变的。 需要注意的是:         数据库连接成功后,初次执行这句话,会报异常,不能用。 如果不是你的语句单词拼写错误,就是因为没有先执行下边这句sql(select 序列名.nextval from dual;)。 也就是先去获取序列的当前值加上增量后的值。(不知道这是啥情况,没有去

随笔 2万+

Oracle 序列(查询序列的值,修改序列的值)

1.序列的语法形式 1 create sequence 序列名 2 increment by n 3 start with n 4 maxvalue n | nomaxvalue 5 minvalue n | nominvalue 6 cycle | nocycle 7 cache n | nocache 序列...

weixin_30588729的博客 2188

oracle创建自增序列

Oracle中,当需要建立一个自增字段时,需要用到sequence。sequence也可以在mysql中使用,但是有些差别,日后再补充,先把oracle中sequence的基本使用总结一下,方便日后查阅。 在oracle中sequence就是序号,每次取的时候它会自动增加。sequence与表没有关系。 1.Create Sequence 首先要有CREATE SEQUEN...

huangshikai 9335

oracle自增字段--序列值获取、修改、设置当前值问题

oracle自增字段--序列值获取、修改、设置当前值问题

weixin_43578304的博客 1982

oracle获取序列并赋值,Oracle中序列的使用

数据库设计的三大范式第一条就是独立的表结构中必须有唯一主键来标识表中数据.在以往微软的SQL Server(duo版本)平台上.手动编码实现表中主键.并设定为自增列是极其简单.编码如下:typeidintnotnullprimarykeyidentity(1,1),在Oracle 10G中关于序列(Sequence)的使用.(A)Sequence-序列的定义语法SEquence-序列是一个数据库项...

weixin_30696613的博客 1388

【oracle】重置序列的当前值

oracle的序列重置值有两种方法

zhouzhou423的专栏 5317
上一篇: C语言编程常见错误
下一篇: Oracle时间函数
Chengdu.S
博客等级 码龄9年 283粉丝 86原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Chengdu.S

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值