割接(3)

--创建业务存储过程
create or replace procedure pro_addclomn_comment
(
   tablename  in varchar2,--目标表名
   ispartition in varchar2--是否分区表 '0'不是分区 '10'范围(时间)分区  '11' hash分区 可自由扩展
)
/*
* 评论等表增加是否非汉字字段业务处理
* @param tablename 目标表名
* @param ispartition 是否分区表 '0'不是分区 '10'范围(时间)分区  '11' hash分区 可自由扩展
* @author xKF24575
* @version [版本号, May 18, 2011]
* @see [相关类/方法]
* @since [产品/模块版本]
*/
is
--resultchar       varchar2(256);--执行结果
partitionname    varchar2(256);--分区名称
v_cs_sql         varchar2(1024);--动态游标sql
v_sql            varchar2(1024);--执行sql
v_sql_temp       varchar2(1024);--执行sql
v_error          varchar2(2048);--出错日志
v_countsql       varchar2(1024);--计算最大、小值sql
v_isnumber       varchar2(1);   --是否是数字类型
n_max            number(30);
n_min            number(30);
n_cur            number(30);
n_tmp            number(30);
v_max            varchar2(30);
v_min            varchar2(30);
v_cur            varchar2(30);
v_tmp            varchar2(30);

TYPE t_ref_cursor IS REF CURSOR;
c                t_ref_cursor; --动态游标

begin
  if ispartition = '10' then --是范围分区表
    v_cs_sql := 'select PARTITION_NAME
                   from USER_TAB_PARTITIONS
                       where TABLE_NAME = upper(:a) and PARTITION_NAME <> ''P1''';
    v_sql_temp :='select actionsql from comment_ctrl where tablename = :c';
    open c for v_cs_sql using tablename;
    fetch c into partitionname;
    while c% found loop
       execute immediate v_sql_temp into v_sql using tablename;
       v_sql := replace(v_sql,':a',partitionname);
       execute immediate v_sql;
       commit;--以分区commit一次
      fetch c into partitionname;
    end loop;   

  end if;
 
  if ispartition = '0' then --不是分区表
     v_sql_temp :='select actionsql,isnumber,maxandminsql from comment_ctrl where tablename = :c';
     execute immediate v_sql_temp into v_sql,v_isnumber,v_countsql using tablename;
    
     if v_isnumber = '1' then --是数字id
       execute immediate v_countsql into n_max,n_min;
      n_cur := n_min;
      while (n_cur <= n_max) loop
      n_tmp := n_cur + 20000;   --这里就是借鉴list分区的思路了
      execute immediate v_sql using n_cur,n_tmp;
      commit;
      n_cur := n_tmp;
      end loop;
     end if;
    
     if v_isnumber = '0' then --是字符id
       execute immediate v_countsql into v_max,v_min;
       v_cur := v_min;
      while (v_cur <= v_max) loop
      v_tmp := v_cur + '10000000';--这里就是借鉴list分区的思路了
      execute immediate v_sql using v_cur,v_tmp;
      commit;
      v_cur := v_tmp;   
      end loop; 
     end if;
    
  end if;
  commit;
  exception
   when others then
   v_error := sqlcode || ' - ' || sqlerrm;
   prc_iread_sys_writelog (2,4,'pro_addclomn_comment',v_error,'');
end pro_addclomn_comment;
/

begin
pro_addclomn_comment('us_publiccomment','0');
end;
/
begin
pro_addclomn_comment('us_bookcomment_audit','1');
end;
/
begin
pro_addclomn_comment('us_bookcomment_publish','1');
end;
/
begin
pro_addclomn_comment('us_usercomment','0');
end;
/
begin
pro_addclomn_comment('us_topic','0');
end;
/
begin
pro_addclomn_comment('us_leaveword','0');
end;
/

你可能感兴趣的:(sql,C++,c,C#)