管理sequence

1.首先建一个sequence和表的对应关系表:

create table T_TABLE_SEQ

(

  table_name VARCHAR2(50) not null,

  seq_name   VARCHAR2(50)

)

把所有需要管理的sequence和对应的表插入此表

 

第一种情形:

 由于迁移或者其他情况需要根据表的字段的值增大sequence

create or replace procedure sp_change_seq

as

  col_name    VARCHAR2(50);

  str_sql     VARCHAR2(150);

  max_val     INTEGER;

  seq_val     INTEGER;

  str_seq_sql VARCHAR2(200);

  tmp_val     INTEGER;

BEGIN

  FOR i IN (SELECT table_name, seq_name FROM t_table_seq) LOOP

    BEGIN

      col_name := '';

 

      SELECT column_name

        INTO col_name

        FROM all_tab_columns

       WHERE wner = USER

         AND column_id = 1

         AND table_name = i.table_name;

 

      str_sql := 'select max(' || col_name || ')  from ' || i.table_name;

 

      EXECUTE IMMEDIATE str_sql INTO max_val;

 

      str_seq_sql := 'SELECT ' || i.seq_name || '.Nextval FROM DUAL';

 

      EXECUTE IMMEDIATE str_seq_sql INTO seq_val;

 

      IF nvl(seq_val, 0) <= nvl(max_val, 0) THEN

 

        FOR x IN 1 .. (nvl(max_val, 0) - nvl(seq_val, 0)) LOOP

 

          EXECUTE IMMEDIATE 'select ' || i.seq_name || '.Nextval  FROM DUAL'

            INTO tmp_val;

 

        END LOOP;

      END IF;

    END;

  END LOOP;

END;

 

 

第二种情形:

需要把sequence统一改为从某个值开始

 

CREATE OR REPLACE PROCEDURE sp_seq_alter_all_count(i_seq_start_count INT,

                                                   i_table_name      VARCHAR2 DEFAULT NULL) AS

 

  v_drop_sql   VARCHAR2(4000);

  v_create_sql VARCHAR2(4000);

BEGIN

  FOR i IN (SELECT dbms_metadata.get_ddl(u.object_type, u.object_name) seq_str

              FROM user_objects u

             WHERE u.object_type IN ('SEQUENCE')

               AND u.object_name IN

                   (SELECT upper(seq_name) FROM t_table_seq WHERE i_table_name IS NULL OR table_name = upper(i_table_name))) LOOP

 

    v_drop_sql   := REPLACE(substr(i.seq_str, 1,instr(i.seq_str, 'MINVALUE') - 1),'CREATE ','DROP ');

 

    v_create_sql := substr(i.seq_str, 1, instr(i.seq_str, 'WITH') + 3) || ' ' || i_seq_start_count || ' ' || substr(i.seq_str, instr(i.seq_str, 'CACHE'));

 

    EXECUTE IMMEDIATE v_drop_sql;

 

    EXECUTE IMMEDIATE v_create_sql;

 

  END LOOP;

END;

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/11745285/viewspace-751811/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/11745285/viewspace-751811/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值