Oracle序列的创建与重置
2017-12-15 09:07
267 查看
表记录的流水号通常都用序列的方法来做,有时在创建工程中需要进行重置,例如在创建阶段、测试阶段等,我们可以通过多种方式重置序列,删除重建、序列重置等。下面是两种方法的存储过程实例。
要实现下面的存储过程,需要授予权限。
GRANT CREATE SEQUENCE TO user;
1、删除重建存储过程
实际上也可以用于创建,因为存储过程是先判断,存在则删除,接下来是重建。
程序流程如下:
对给定的序列进行判断,是否存在,如果存在则删除;
根据序列名称进行创建,默认从1开始到9999999999,每次步长为1;
2、删除序列会导致与该序列相关的存储过程、函数等失效而重新编译,有时为了防止重新编译,不能删除。于是需要一种不编译也可以重置序列的方法,我们可以通过更改反向步长,用意是退回到1,然后在更改为正向步长,从而实现序列的重置。
要实现下面的存储过程,需要授予权限。
GRANT CREATE SEQUENCE TO user;
1、删除重建存储过程
实际上也可以用于创建,因为存储过程是先判断,存在则删除,接下来是重建。
程序流程如下:
对给定的序列进行判断,是否存在,如果存在则删除;
根据序列名称进行创建,默认从1开始到9999999999,每次步长为1;
/*** p_SetSequence 删除并重建指定序列 ***/ CREATE OR REPLACE PROCEDURE p_SetSequence ( uSequence IN VARCHAR2 -- 指定的序列 ) AS uNum NUMBER; uSQL VARCHAR(100); BEGIN uSQL := 'DROP SEQUENCE ' || uSequence; SELECT COUNT(*) INTO uNum FROM DUAL WHERE EXISTS ( SELECT * FROM User_Sequences WHERE SEQUENCE_NAME = UPPER(uSequence) ); IF (uNum = 1) THEN EXECUTE IMMEDIATE uSQL; DBMS_OUTPUT.PUT_LINE('序列 '|| uSequence ||' 被删除了。'); ELSE DBMS_OUTPUT.PUT_LINE('序列 '|| uSequence ||' 不存在。'); End IF; uSQL := 'CREATE SEQUENCE ' || uSequence; uSQL := uSQL ||' INCREMENT BY 1 START with 1 MAXVALUE 9999999999'; EXECUTE IMMEDIATE uSQL; END p_SetSequence; /
2、删除序列会导致与该序列相关的存储过程、函数等失效而重新编译,有时为了防止重新编译,不能删除。于是需要一种不编译也可以重置序列的方法,我们可以通过更改反向步长,用意是退回到1,然后在更改为正向步长,从而实现序列的重置。
/*** p_ReSetSequence 重置指定序列 ***/ < 4000 span class="hljs-operator">create or replace procedure p_ReSetSequence ( uSequence IN VARCHAR2 -- 指定的序列 ) AS uNum NUMBER(10); uSQL VARCHAR2(100); BEGIN SELECT COUNT(*) INTO uNum FROM DUAL WHERE EXISTS ( SELECT * FROM User_Sequences WHERE SEQUENCE_NAME = UPPER(uSequence) ); IF (uNum = 1) THEN -- 1.获得序列当前的值 uSQL := 'SELECT '|| uSequence ||'.NEXTVAL FROM DUAL'; EXECUTE IMMEDIATE uSQL INTO uNum; -- 2.修改序列的步长和方向,通过负值改变方向 uNum := - (uNum-1); uSQL := 'ALTER SEQUENCE '|| uSequence ||' INCREMENT BY '|| uNum; EXECUTE IMMEDIATE uSQL; -- 3.通过获取序列的下一个值来实现反向取值1次 uSQL := 'SELECT '|| uSequence ||'.NEXTVAL FROM DUAL'; EXECUTE IMMEDIATE uSQL INTO uNum; -- 4.回复序列的步长和方向 uSQL := 'ALTER SEQUENCE '|| uSequence ||' INCREMENT BY 1'; EXECUTE IMMEDIATE uSQL; DBMS_OUTPUT.PUT_LINE('序列 '|| uSequence ||' 被重置了。'); ELSE DBMS_OUTPUT.PUT_LINE('序列 '|| uSequence ||' 不存在。'); End IF; END p_ReSetSequence; /
相关文章推荐
- oracle 序列重置
- Oracle中创建表,创建序列,创建自增字段,添加注释, 添加记录,添加触发器,提交
- Oracle笔记 五、创建表、约束、视图、索引、序列、同义词、表空间
- oracle 中序列的创建
- Oracle重置序列(不删除重建方式)
- Oracle - 创建表空间,序列
- Oracle重置序列(不删除重建方式)
- ORACLE 创建序列
- Oracle序列(Sequence)创建、使用、修改、删除
- Oracle创建表,注释,视图,序列,同义词,触发器,存储过程举例
- Oracle序列批量重置
- 在oracle中给一个表创建序列的语句
- oracle中利用序列和触发器创建自增长的表
- oracle增加主键列,创建序列,并自动根据序列设值,创建触发器。
- (学) 如何将 Oracle 序列 重置 清零 How to reset an Oracle sequence
- oracle创建表,追加备注,添加主键,触发器,自动增长序列
- Oracle创建带有自增序列的表和字符串转日期的问题
- oracle创建和管理表、完整性约束、创建视图、序列、索引、同义词
- 创建序列和触发器实现Oracle字段自增功能
- oracle下重置用户的所有序列