Oracle序列的创建与重置

表记录的流水号通常都用序列的方法来做,有时在创建工程中需要进行重置,例如在创建阶段、测试阶段等,我们可以通过多种方式重置序列,删除重建、序列重置等。下面是两种方法的存储过程实例。
要实现下面的存储过程,需要授予权限。
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 重置指定序列
***/
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;
/
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

彖爻之辞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值