Oracle根据现有序列最大值创建序列DDL(批量)

1. 需求说明

dev环境上基础表 数据 (比如菜单/角色/字典等) ,拷贝到test环境或者uat环境;  会有遇到序列不同步的情况。

2. 解决方法 ( 可直接跳到文末, 有datagrip一秒自动生成序列方式 )

创建序列脚本带上 已有最大值, 即 : 

create sequence SEQ_xxx start with 最大值 ;

3. 脚本

--  自动读取当前用户下序列最大值并生成创建序列的脚本
--1. 执行 查询语句, 结果产生一个 [拼接的查询语句], 是 一个拼接的查询语句;
--2. 执行 [拼接的查询语句],  结果产生一个 [创建序列DDL 语句]
--3 . 修改 sequence_owner 和  SEQUENCE_NAME 条件 ,一次大概只能 创建40个序列左右
SELECT
       'select ' || substr(bigsql, 0, (length(bigsql) - 2)) || ' from dual'
from (
         SELECT rtrim(xmlagg(xmlparse(content sqltmp || '||' wellformed) ORDER BY sqltmp).getclobval(), ',') bigsql
         from (
                  select '  ' || '''' || 'create sequence ' || SEQUENCE_NAME || ' start with  ' || '''||' ||
                         SEQUENCE_NAME || '.nextval  ' || '||' || '''' || ';' || '''' as sqltmp
                  from dba_sequences
                  -- *** 修改下面数据库用户
                  where sequence_owner = 'CS_PLATFORM_ZQ'
                    --  *** 下面指定几个序列测试, 根据需要注释掉
                    and SEQUENCE_NAME in
                       ('SEQ_USER_USER_BASIC', 'SEQ_USER_ROLE_MENU_XW')
              ) t
         GROUP BY 1) tmmp;

4. 执行效果

第一步: (很长的一段sql)

 

 第二步: 

  复制第一步的执行结果,继续执行(tips: 这里建议先拷贝到txt编辑器, 然后再复制到数据库工具里面; 直接复制到 datagrip的话, 会被编辑器搞乱字符  )

可以看到 就是需要的创建序列脚本,并带了最大值;

5. 最简方式

直接使用datagrip自动生成,步骤如下

 

 结果: (脚本已经复制了,这时候直接ctrl+v就出来了)

 

posted @ 2022-04-26 12:28  将军上座  阅读(424)  评论(0编辑  收藏  举报