注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

和申的个人主页

专注于java开发,1985wanggang

 
 
 

日志

 
 

检查数据表sequence 是否 正常pl/sql oracle  

2010-10-25 13:25:20|  分类: 数据库 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
 
有时候导数据的时候,sequence 的值 比表中的值要小
可以调用这个存储过程pl/sql
pkg_check_sequence.p_check_reset_sequence('mytest_table','seq_mytest_table');

代码:

create or replace package pkg_check_sequence is
/**
date:2010-10-21
author:wanggang
*/
     procedure p_check_reset_sequence(v_table_name varchar2,v_sequence_name varchar2);
end;
/
create or replace package body pkg_check_sequence is
  /**
  date:2010-10-21
  author:wanggang
  */
  procedure p_check_reset_sequence(v_table_name    varchar2,
                                   v_sequence_name varchar2) is
    v_sqlexec         VARCHAR2(2000); --DDL语句变量
    v_table_max_id    number;
    v_sequence_max_id number;
    v_exist_sequence  number := 1;
  begin
 
    v_sqlexec := 'select max(id) from ' || v_table_name;
 
    /**
                    --execute immediate v_sqlexec into v_count using p_id;
                  --execute immediate v_sqlexec returning into v_count using v_count ;
                  **/
     dbms_output.put_line(v_sqlexec);
   -- execute immediate v_sqlexec returning into v_table_max_id;
  execute immediate v_sqlexec into v_table_max_id;
    v_sqlexec := 'select ' || v_sequence_name || '.nextval from dual';
  dbms_output.put_line(v_sqlexec);
  begin
    execute immediate v_sqlexec
       into v_sequence_max_id;
   exception
   when OTHERS  then
 
    v_exist_sequence := 0;
    dbms_output.put_line( 'no this ' ||v_sequence_name ||' sequence ');
  end;
 
    if (v_sequence_max_id < v_table_max_id  or v_sequence_max_id is null) then
     if(v_exist_sequence = 1 ) then
     dbms_output.put_line('table_max_id('||v_table_name||'):'||v_table_max_id);
     dbms_output.put_line('v_sequence_max_id:('||v_sequence_name||'):'|| v_sequence_max_id);
      v_sqlexec := 'drop sequence '||v_sequence_name;
      dbms_output.put_line(v_sqlexec);
      
      DBMS_Utility.Exec_DDL_Statement(v_sqlexec);
      end if;
      v_sqlexec := 'create sequence '||v_sequence_name || ' start with '||(v_table_max_id +1);
      dbms_output.put_line(v_sqlexec);
     -- execute immediate v_sqlexec returning into v_table_max_id;
      DBMS_Utility.Exec_DDL_Statement(v_sqlexec);
      dbms_output.put_line(v_table_name|| ' ' ||v_sequence_name ||' sequence recreate ');
    else
      dbms_output.put_line(v_table_name|| ' ' ||v_sequence_name ||' sequence right ');
    end if;
 
  end;
end;
/
=============================================================================
=============================================================================

调用代码
declare
  -- Local variables here
  i integer;
begin
 
  pkg_check_sequence.p_check_reset_sequence('mytest_table','seq_mytest_table');

end;
=============================================================================

可能需要授权:
grant create sequence to user_name;
  评论这张
 
阅读(1025)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2016