ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 管理sequence

管理sequence

原创 Linux操作系统 作者:xiaofan8368 时间:2012-12-28 14:37:50 0 删除 编辑

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博客 ” ,链接:https://blog.itpub.net/11745285/viewspace-751811/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: 递归打平的方法
下一篇: 递归打平
请登录后发表评论 登录
全部评论

注册时间:2012-12-10

  • 博文量
    13
  • 访问量
    26887