首页 >

Oracle 批量更新sequence的存储

数据库|mysql教程Oracle 批量更新sequence的存储
Oracle sequence,Oracle存储,Oracl
数据库-mysql教程
qq访客统计 源码,ubuntu 机顶盒,拼多多2021爬虫,PHP获取PHP文件中变量,seo期末测试lzw
前言: Oracle的序列(SEQUENCE)A SCHEMA OBJECT THAT GENERATES A SERIAL LIST OF UNIQUE NUMBERS FOR TABLE COLUMNS.TO USE A
b2b库存源码,vscode解决方案,ubuntu支持xfs,tomcat配置其他ip,sqlite 云数据库连接,卫生间地漏爬虫怎么办,php 获取 年份,福建神马网站seo推广,图片 套网站模板下载,网站头部尾部模板lzw
android handler源码,vscode asp,ubuntu 如何添加源,歌曲tomcat,sqlite读列名,域名不变 想换个空间 哪个服务器好,vs2005源代码管理插件,前端后台框架模板,php 爬虫教程,php写博客,泑泑seo,个人主页网站源代码,html5网页版聊天界面代码,分销网络模板,手机淘宝页面布局,c停车场管理系统源代码,易语言禁止程序双开lzw

前言:

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_表名字),再由于这样的序列并不多,所以将这些一一处理

在更新前可先注释掉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))


Oracle 批量更新sequence的存储
  • Oracle 中的sequence用法
  • Oracle 中的sequence用法 | Oracle 中的sequence用法 ...

    Oracle 批量更新sequence的存储
  • Oracle利用触发器和sequence实现主键自增长
  • Oracle利用触发器和sequence实现主键自增长 | Oracle利用触发器和sequence实现主键自增长 ...

    Oracle 批量更新sequence的存储
  • Oracle和MySQL分别生成sequence序列
  • Oracle和MySQL分别生成sequence序列 | Oracle和MySQL分别生成sequence序列 ...