0

0

Oracle 批量更新sequence的存储

php中文网

php中文网

发布时间:2016-06-07 16:43:58

|

1467人浏览过

|

来源于php中文网

原创

前言: Oracle的序列(SEQUENCE)A SCHEMA OBJECT THAT GENERATES A SERIAL LIST OF UNIQUE NUMBERS FOR TABLE COLUMNS.TO USE A

前言:

Oracle的序列(SEQUENCE)A SCHEMA OBJECT THAT GENERATES A SERIAL LIST OF UNIQUE NUMBERS FOR TABLE COLUMNS.TO USE A SEQUENCE ,YOUR SCHEMA MUST CONTAIN THE SEQUENCE OR YOU MUST HAVE BEEN GRANTED THE SELECT OBJECT PRIVILEGE FOR ANOTHER USER IS SEQUENCE.ONCE A SEQUENCE IS DEFINED,IT CAN BE ACCESSED AND INCREMENTED BY MULTIPLE USERS(WHO HAVE SELECT OBJECT PRIVILEGE FOR THE SEQUENCE CONTAINING THE SEQUENCE)WITH NO WAITING.THE DATABASE DOES NOT WAIT FOR A TRANSACTION THAT HAS INCREMENTED A SEQUENCE TO COMPLETE BEFORE THAT SEQUENCE CAN BE INCREMENTED AGAIN. 

简单说:序列一般用于自动递增生成主键值 ..

但是否有一些情况会导致调用SEQ_....NEXTVAL时大于主键最大值呢?

场景:

  主键表 -> T表 '100W'数据同步到T1表(同步:TRUNCATE/DELETE或IMPDP...等方式[手动改数据])

  例如: T表对应SEQ_T.NEXTVAL= 100W;

        T1表对应SEQ_T.NEXTVAL= 10W;

        TRUNCATE TABLE T1;

        INSERT TABLE T1 SELECT * FROM T;

        数据同步但T1表对应SEQ_T.NEXTVAL= 10W序列不变;

        此时T1调用序列INSERT到T1表时就会报错 ( ORA-00001 : 违反唯一约束条件 (LOTTERY.PK_T1))

        (若批量同步很多表就可能会引起很多表序列需要更新成主键最大值+ 1才能保证不报错

        (可以用把源库的SEQUENCE同步过来①或者如下存储解决② ))

  ①PLSQL 工具的COMPARE USER OBJECTS可以解决SEQUENCE序列对象同步到其他环境...在此就不细说了

  ②我们环境序列一般都是由SEQ_表名字组成.所以写批量更新存储的时候比较方便~

  如下存储针对常用于以上场景的环境,,生产环境不批量导新数据/同步用户数据/表数据 就很少用到...也可只提供参考...

--批量更新序列存储--
CREATE OR REPLACE PROCEDURE P_SYNCSEQ(USERNAME VARCHAR2 /*传入要检查/更新序列的用户*/ ) IS

  /*

  **@AUTHOR 毛海晴

  ORACLE 批量更新SEQUENCE

  注释:

    批量更新SEQUENCE,

    更新序列下一个值 = 主键最大值+1

    ---序列创建时,属性NOMAXVALUE=最大值是10的28次方

  思路:

    1、找到每个表主键列 且在该表主键最大值是什么?

    2、找到表对应SEQUENCE值 与 表主键最大值去对比。

    如果SEQUENCE 下一个值大于表主键最大值就不做更新;
 

    否则需要进行更新(2中更新方式)

    1)删除SEQUENCE ,创建新序列开始值为表主键最大值+1;  --本文选择此方案...嘿嘿~

    (坏处:赶好在DROP SEQUENCE..而程序也恰巧调用依赖它的函数和存储过程将失效

    但 后续CREATE SEQUENCE了,再调用了会重新编译 调用..不会报错....有实验过哦~)

    2)ALTER SEQUENCE .. INCREMENT BY .. NOCACHE;

      SELECT ...NEXTVAL FROM DUAL;

      ALTER SEQUENCE .. INCREMENT BY 1 CACHE 20;

    .... sequence.nextval其实也可以用user_sequences.last_number字段实现..由于最早存储就这样的写就没改~...谅解~

    SEQUENCE和表名长度最大限制是30

    SEQUENCE规范的名字SEQ_+表名字    -- 此处规范只是管理维护方便而已 并不是非要这样要求

    如果表名长度大小大于26 加上"SEQ_"就大于了SEQUENCE长度限制的30

    若表名长度大于26,那对应序列肯定不是规范命名(SEQ_表名字),再由于这样的序列并不多,所以将这些一一处理

艾绘
艾绘

艾绘:一站式绘本创作平台,AI智能绘本设计神器!

下载

    在更新前可先注释掉EXECUTE IMMEDIATE,先作下测试看下效果,免得EXECUTE IMMEDIATE DROP .后创建报错,导致在调用 序列不会创建,也校验不到序列

 

    所需权限:
    -- 创建序列权限 --

    -- Grant/Revoke system privileges
    grant create sequence to LOTTERY;
    --查询权限--
    -- Grant/Revoke object privileges
    grant select on DBA_CONSTRAINTS to LOTTERY;
    grant select on DBA_CONS_COLUMNS to LOTTERY;
    grant select on DBA_SEQUENCES to LOTTERY;
    grant select on DBA_TABLES to LOTTERY;
    grant select on DBA_TAB_COLUMNS to LOTTERY;
      --或者--
      -- Grant/Revoke system privileges
      grant select any dictionary to LOTTERY;
 

 */


 

  --变量

  MAX_ID            NUMBER(12 ); 

  P_SEQ_NUM          NUMBER(12 );

  P_TABLE_NAME      VARCHAR2(50 );

  P_COLUMN          VARCHAR2(50 );

  P_SEQUENCE        VARCHAR2(50 );

  P_SQL              VARCHAR2(500 );

  P_SEQ_SQL          VARCHAR2(5000 );

  P_SQL_SEQ          VARCHAR2(30000 );

  P_NEW_COUNT        NUMBER(12 );


 

  --查询表长度小于26 的表/序列

  --游标

  CURSOR C_CONS IS -- 查询表长度小于26 的表/序列

    SELECT T1.TABLE_NAME    TABLE_NAME,

          T1.COLUMN_NAME    COLUMN_NAME,

          T1.SEQUENCE_NAME1 SEQUENCE_NAME

      FROM ((SELECT C.TABLE_NAME,

                    CASE

                      WHEN C1.DATA_TYPE = 'NUMBER' THEN

                      C.COLUMN_NAME

                      ELSE

                      'TO_NUMBER(' || C.COLUMN_NAME || ')'

                    END COLUMN_NAME,

                    C.SEQUENCE_NAME1

              FROM (SELECT C.TABLE_NAME,

                            C.COLUMN_NAME,

                            'SEQ_' || C.TABLE_NAME SEQUENCE_NAME1

                      FROM DBA_CONS_COLUMNS C --用户的约束对应的表列信息

                      WHERE C.OWNER = UPPER (USERNAME)

                        AND (C.CONSTRAINT_NAME, C.TABLE_NAME) IN

                            ( SELECT S.CONSTRAINT_NAME, S.TABLE_NAME

                              FROM DBA_CONSTRAINTS S --用户的对象约束信息

                              WHERE S.OWNER = (UPPER (USERNAME))

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

178

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

35

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

79

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

2

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

4

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

8

2026.01.28

Python 自然语言处理(NLP)基础与实战
Python 自然语言处理(NLP)基础与实战

本专题系统讲解 Python 在自然语言处理(NLP)领域的基础方法与实战应用,涵盖文本预处理(分词、去停用词)、词性标注、命名实体识别、关键词提取、情感分析,以及常用 NLP 库(NLTK、spaCy)的核心用法。通过真实文本案例,帮助学习者掌握 使用 Python 进行文本分析与语言数据处理的完整流程,适用于内容分析、舆情监测与智能文本应用场景。

24

2026.01.27

拼多多赚钱的5种方法 拼多多赚钱的5种方法
拼多多赚钱的5种方法 拼多多赚钱的5种方法

在拼多多上赚钱主要可以通过无货源模式一件代发、精细化运营特色店铺、参与官方高流量活动、利用拼团机制社交裂变,以及成为多多进宝推广员这5种方法实现。核心策略在于通过低成本、高效率的供应链管理与营销,利用平台社交电商红利实现盈利。

122

2026.01.26

edge浏览器怎样设置主页 edge浏览器自定义设置教程
edge浏览器怎样设置主页 edge浏览器自定义设置教程

在Edge浏览器中设置主页,请依次点击右上角“...”图标 > 设置 > 开始、主页和新建标签页。在“Microsoft Edge 启动时”选择“打开以下页面”,点击“添加新页面”并输入网址。若要使用主页按钮,需在“外观”设置中开启“显示主页按钮”并设定网址。

72

2026.01.26

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
SQL 教程
SQL 教程

共61课时 | 3.6万人学习

Java 教程
Java 教程

共578课时 | 52.6万人学习

oracle知识库
oracle知识库

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号