您的位置:首页 > 数据库 > Oracle

Oracle序列的创建与重置

2017-12-15 09:07 267 查看
表记录的流水号通常都用序列的方法来做,有时在创建工程中需要进行重置,例如在创建阶段、测试阶段等,我们可以通过多种方式重置序列,删除重建、序列重置等。下面是两种方法的存储过程实例。

要实现下面的存储过程,需要授予权限。

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;
/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: