Oracle序列的创建与重置

来源:互联网 发布:游族网络林奇妻子韩薇 编辑:程序博客网 时间:2024/06/05 17:01

表记录的流水号通常都用序列的方法来做,有时在创建工程中需要进行重置,例如在创建阶段、测试阶段等,我们可以通过多种方式重置序列,删除重建、序列重置等。下面是两种方法的存储过程实例。
要实现下面的存储过程,需要授予权限。
GRANT CREATE SEQUENCE TO user;

1、删除重建存储过程
实际上也可以用于创建,因为存储过程是先判断,存在则删除,接下来是重建。
程序流程如下:
对给定的序列进行判断,是否存在,如果存在则删除;
根据序列名称进行创建,默认从1开始到9999999999,每次步长为1;

/***  p_SetSequence 删除并重建指定序列***/CREATE OR REPLACE PROCEDURE p_SetSequence(  uSequence IN VARCHAR2     -- 指定的序列)ASuNum 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 重置指定序列***/create or replace procedure p_ReSetSequence(  uSequence IN VARCHAR2     -- 指定的序列)ASuNum 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;/