`
jerry_chen
  • 浏览: 282628 次
  • 性别: Icon_minigender_2
  • 来自: 北京
社区版块
存档分类
最新评论

存储过程 建表 分表

 
阅读更多

 

由于单表数据量太大,达到千万级别,所以考虑采用oracle的存储过程实施分表操作。

 

说明:schema表中存储指标信息

          store表中存放schema中指标指定的存储信息

          dic_info是字典表

 

          按照schema的id号建相同表结构的表,更新字典项,把原始的大表里的数据分摊到新建的小表中,实现分表。

 

create or replace procedure PROC_CREATE_TABLE_INSERT_DATA

(

  --用以输出的信息

  on_flag out number,            --SQL错误码

  out_reason out varchar2       --错误原因

)

is

  v_table_name varchar2(50);              --新生成的数据表表名

  v_table_num integer;                      --数据表的数据量

  v_create_sql varchar2(768);            --建表语句

  v_data_insert varchar2(256);           --数据插入语句

  v_old_table varchar2(50);               --原始表表名

  v_dic_sql varchar2(128);                --字典项查询语句

  v_dic_count integer;                      --字典项记数

  v_data_count_sql varchar2(128);       --数据统计语句

  v_data_count integer;                    --数据记数

 

begin

  --schema表中的数据存储信息放在store表中,而store表中的表id号是存储在字典表dic_info中的,现在将schema id作为新的表名,原始存储表名作为旧的表名

  --oracle循环查询的结果集到v_schemas变量中

  for v_schemas in (select a.id as newTable, c.code as oldTable

                      from schema a, store b, dic_info c

                     where b.tablenameid = c.id and a.storeid = b.id) loop

    v_table_name := v_schemas.newTable;           --oracle数据复制给变量

    v_old_table := v_schemas.oldTable;

   

    --检测是否已存在要建的表

    select count(*) into v_table_num from user_tables where table_name = upper(v_table_name);

    if (v_table_num < 1) then

      v_create_sql := 'create table '|| v_table_name || '(

        id            VARCHAR2(50) primary key,

        schemaid    VARCHAR2(50),

        columnvalue1  VARCHAR2(128),

        columnvalue2  VARCHAR2(128),

        columnvalue3  VARCHAR2(128)

      )';

 

      --建表

      execute immediate v_create_sql;

      commit;

     

      dbms_output.put_line('新建表:' || v_table_name || ' 成功。');      --输出记录

     

     

      --更新dic_info中的表信息

      v_dic_sql := 'select count(*) from dic_info where code = ' || chr(39) || v_table_name || chr(39);

      execute immediate v_dic_sql into v_dic_count;

      if (v_dic_count < 1) then

        insert into dic_info

        -- select sys_guid() from dual oracle中新建GUID的方式

        values ((select sys_guid() from dual), v_table_name, v_table_name,

              '48484a2730b1703c0130b5651e9a001e', null, 0, null, null);

        commit;

      end if;

     

     

      --将原始数据表中的采集数据导入新建表
      --oracle
chr(39)表示单引号

      v_data_insert := 'insert into ' || v_table_name || ' (select * from ' || v_old_table || ' where schemaid = ' || chr(39)|| v_table_name || chr(39) || ')'

      v_data_count_sql := 'select count(*) from ' || v_table_name;

      --由于v_table_name是动态生成的,所以需要用execute去执行

      execute immediate v_data_count_sql into v_data_count;

      if (v_data_count < 1) then

         execute immediate v_data_insert;

         commit;

         execute immediate v_data_count_sql into v_data_count;

         dbms_output.put_line('向表' || v_table_name || '中存入数据' || v_data_count || '');

      end if;

     

     

      --更新存储定义

      update store a set a.tablenameid = (select id from dic_info where name = v_table_name)

       where id = (select storedeid from schema where id = v_table_name);

      commit;     

           

    else 

      dbms_output.put_line('指定表:' || v_table_name || ' 已存在。');

    end if;

   

  end loop;

 

--处理异常

  EXCEPTION

    WHEN OTHERS THEN

      on_flag := SQLCODE;

      out_reason := SUBSTR (SQLERRM, 1, 255);

      ROLLBACK;

     

end;

 

 

 

PS:在存储过程执行过程中抛出    

    ORA-20000:   buffer   overflow,   limit   of   10000   bytes异常,

    是因为有dbms_output.put_line语句,在pl/sql脚本中执行

      SQL> set serveroutput 100000;

       也不行。后来改为Test时手动修改 Buffer si的容量后才没有报错。

 


  • 大小: 6.8 KB
分享到:
评论

相关推荐

    MySQL动态创建表,数据分表的存储过程

    总的来说,这个存储过程展示了如何在MySQL中动态创建表和进行数据分表的操作,它对于处理大量数据的系统非常有用,可以显著提高查询效率和系统响应速度。同时,这种方法也使得数据库的扩展性和可维护性得到了提升,...

    sharding-jdbc按月分表样例2

    例如,当插入一条新订单时,通过当前日期计算出应该存储的表名,然后执行SQL语句。 4. **SQL解析与改写**:Sharding-JDBC内部集成了SQL解析引擎,能够识别并改写SQL语句,使其适应分片环境。对于按月分表的场景,...

    十次方建表语句

    - **存储过程**:预编译的SQL语句集合,可封装复杂的业务逻辑,提高性能并减少网络传输。 - **权限管理**:根据用户角色分配不同的访问权限,保障数据安全。 在“十次方建表语句”的场景中,可能涵盖各种不同领域...

    MySQL之存储过程按月创建表的方法步骤

    本篇文章将详细介绍如何利用MySQL的存储过程按月创建表的方法步骤,这对于数据管理、分表存储以及历史数据归档等场景非常有用。 首先,我们看到代码中定义了一个名为`create_table_by_month`的存储过程。存储过程的...

    mysql分表和分区的区别浅析

    例如,使用Merge存储引擎进行分表,会创建一个总表(如alluser)作为接口,实际数据存储在各个分表(如user1和user2)中。总表并不存储数据,只是一个逻辑上的容器,用于合并查询和管理分表。 **二、分区** 分区则...

    DRDS分库分表—— RDS关系数据库云服务的水平扩容技术

    DRDS(分布式关系型数据库服务)是阿里巴巴云服务中提供的关系数据库云服务,它能够帮助用户进行水平扩容,具体是指通过分库分表技术,使得数据库能够处理更多的数据量和更频繁的查询。该技术是针对大规模数据处理...

    mysql .pdf建表的一些规则 和注意事项

    - **推荐做法**:根据字段的热度、冷度、静态性、大小等因素进行垂直分表,将热点数据和冷数据分开存储,以优化查询性能。 **3.2 水平分表** - **推荐做法**:当单表数据量过大时,可以采用水平分表策略,通过哈希...

    建表规范丶SQL规范丶索引规范-word文档

    在分库分表环境下,需统一分配各表中的主键值以避免整个逻辑表中主键重复。 - **字符集**:必须使用utf8mb4字符集,这是真正的“UTF-8”字符集。 - **注释**:数据库表、表字段必须加入中文注释。 - **命名...

    多数据源的分表分库6-13.docx

    这里需要注意的是实际的分表规则并没有给出,通常会涉及到根据某字段(如`id`)的值进行哈希计算,从而确定记录存储的位置。 #### 四、总结 本文通过对“多数据源的分表分库6-13”文档内容的分析,详细介绍了如何...

    利用kettle自动创建oracle表分区

    然后,设置变量,来存储最大分区的信息。最后,建立作业,调度交换,以自动创建新的分区。 在Kettle中,获取最大分区的SQL语句如下: ``` select to_date(to_char(sysdate,'yyyymmdd'),'yyyymmdd')-to_date...

    文档围绕企业中关系相关技术展开,讲述了关系统的基本知识,常用建表和查询语言以及优化,还有索引的知识。

    关系型数据库采用关系模型来组织数据,这种模型以行和列的形式存储数据,便于用户理解和操作。每个数据表都有预定义的表结构,数据按照最小关系表的形式存储,以避免数据冗余和提高数据的一致性。关系型数据库的主要...

    dbFramework:一个简单的dbframework

    简单的数据库存储框架,适合简单的单机游戏服务器/应用服务器使用,省去开发人员自己建表/分表,让开发人员更专注于业务逻辑 限制: 暂时只实现了单服,没有实现高可用,后续有时间可以考虑将数据先同步到redis集群...

    MySQL 建表的优化策略 小结

    MySQL 建表的优化策略是数据库设计的关键环节,它直接影响到数据存储的效率和查询性能。以下是对各个知识点的详细解析: 1. **字符集的选择**:在确定数据仅包含中文并且不需要处理其他语言字符时,GBK字符集是优选...

    36.为什么临时表可以重名?1

    内存表使用Memory引擎,数据存储在内存中,系统重启后数据丢失,而临时表则可以使用多种引擎,包括InnoDB和MyISAM,其数据存储在磁盘上,但生命周期仅限于创建它的会话(session)。 临时表的特性如下: 1. **创建...

    java多数据源代码实例

    4. 负载均衡:通过分库分表,可以将请求分散到多个数据库,降低单个数据库的压力。 二、Java多数据源实现方式 1. 动态切换数据源:在运行时根据业务需求动态选择合适的数据源,常见的实现方式是使用AOP(面向切面...

    云数据库ClickHouse分析业务最佳实践.pdf

    分区是根据数据的某些列值来组织的,可以理解为传统数据库中的分表。分区可以基于时间、范围或者散列函数来实现。分区的数据在磁盘上是有序存储的,且无须维护额外的索引结构。 在表结构设计方面,ClickHouse允许...

    mycat mySql集群配置

    MySQL集群配置是一个复杂的过程,特别是在大数据量和高并发的场景下,为了提升数据库的性能和可用性,我们通常会采用分布式数据库系统,如mycat。mycat是一个开源的分布式数据库系统,它作为数据库中间件,能够实现...

    mybaitis代码生成工具

    MyBatis是一个优秀的Java持久层框架,它支持定制化SQL、存储过程以及高级映射。MyBatis避免了几乎所有的JDBC代码和手动设置参数以及获取结果集。MyBatis可以使用简单的XML或注解进行配置和原始映射,将接口和Java的...

    mysql_数据库规范.docx

    - **分库分表、分区表**:根据业务需求,当数据量过大时,考虑水平分库分表或垂直分区,提高查询效率。 - **字符集**:选择合适的字符集,如`utf8mb4`支持四字节Unicode字符,确保数据的兼容性。 - **DAO层设计**:...

    java数据库之sql优化

    - 使用整型来存储IP地址,这样可以减少存储空间并提高查询效率。 2. **建表索引** - 不是所有的字段都需要建立索引,应该根据查询需求来针对性地创建。考虑在`WHERE`和`ORDER BY`子句中涉及的列上建立索引。 - ...

Global site tag (gtag.js) - Google Analytics