在ORACLE里用存储过程定期分割表

Oracle数据库里存放着各种各样的数据,其中有一些数据表会随着时间的推移,越来越大。如交友聊天的日志、 短信收发的日志、生产系统的日志、动态网站发布系统的日志等等。这样的信息又和时间紧密相关,有没有办法 让这些日志表能到时间自动分割成历史年月(如log200308,log200309)的表呢? 请看看我用存储过程定期分割表的 方法吧。

一、问题的引出

1.初学数据库时只知道用delete来删除表里的数据。但在Oracle数据库里,大量delete记录后,并不能释放表

所占用的物理空间,这里面有一个高水位的概念,所以我们不能用delete来分割表。

2.用重命名(rename)表的方法

(1).先建一个和原来日志表(假如是log)数据结构一模一样的新表(如log_new),建约束、索引及指定字段的默

认值;

(2).重命名表log到log_YYYYMM;

要注意的问题是OLTP系统可能会因为DML操作阻碍重命名执行成功,出现ORA-00054资源正忙的错误提示,

需要试多次才能成功。

(3).重命名表log_new到log。

这样应用程序不用修改(受影响的时间仅几秒钟),日志表就被截断分割了。

上述步骤可以在Oracle里可以用存储过程来实现它们。

时间: 2024-12-31 20:56:25

在ORACLE里用存储过程定期分割表的相关文章

折腾Oracle问题小菜记[分页存储过程/查询所有表、视图、存储过程/查询表、视图、存储过程字段结构与参数](三)

说明: 为了让CYQ.Data 框架支持Oracle,这几天对Oracle进行了基本探索,并把中间遇到的问题轻轻的记录了下来,与大伙共享.     总共有三篇: 1:初折腾Oracle问题小记 2:初折腾Oracle问题小记二 3:就是本篇了:折腾Oracle问题小菜记(三)   本篇又有新突破,再记录一下:   1:自己写了一条分页存储过程,也是CYQ.Data默认产生的存储过程:   create or replace package MyPackage as  type MyCursor 

在Mysql数据库里通过存储过程实现树形的遍历_Mysql

关于多级别菜单栏或者权限系统中部门上下级的树形遍历,oracle中有connect by来实现,mysql没有这样的便捷途径,所以MySQL遍历数据表是我们经常会遇到的头痛问题,下面通过存储过程来实现. 1,建立测试表和数据: DROP TABLE IF EXISTS csdn.channel; CREATE TABLE csdn.channel ( id INT(11) NOT NULL AUTO_INCREMENT, cname VARCHAR(200) DEFAULT NULL, pare

使用Java来编写Oracle数据库的存储过程

Oracle里可以使用多种语言来编写存储过程,比如Pro*C/C++,PL/SQL,COBOL,在Oracle8i开始支持用Java编写存储过程. 如果非要写存储过程的话,做为以Java谋生的我,首选用Java编写,用PL/SQL需要记忆很多的语法(Pascal类的语法)和函数,远不如使用Java/JDBC这么轻车熟路.而且,DB2等数据库都支持Java存储过程,所以不比为每一种数据学习一种编写存储过程的方法了. Java存储过程与一般的JDBC程序有所不同的是: 1.有安全限制,毕竟是在ora

oracel-如何把下面的oracle中的存储过程转换成sql的?

问题描述 如何把下面的oracle中的存储过程转换成sql的? create or replace procedure BJ_MAXCASENO_Get(InCount in number, OutMaxCaseNO out number) as tem number; begin select max(caseno) into tem from BJ_MAXCASENO; if tem is null then tem := 0; -- 没有数据时新增0进入 insert into BJ_MA

使用Java调用Oracle数据库的存储过程实例

使用Java调用Oracle数据库的存储过程实例时间:2009-08-19 18:02:43来源:网络 作者:未知 点击:984次 一:无返回值的存储过程1.建立存储过程CREATE OR REPLACE PROCEDURE TESTA(PARA1 IN VARCHAR2,PARA2 IN VARCHAR2) ASBEGININSERT INTO T_TEST (I_ID,I_NAME) VALUES (PARA1, PARA2);END TESTA; 2.相应的JAVA程序impo一:无返回值

oracle left join 查询右表没有匹配到的数据

问题描述 oracle left join 查询右表没有匹配到的数据 oracle left join 查询右表没有匹配到的数据,目前用的是 is null 做的判断,但是效率很慢,各位大神有没有高效一点的方法 select shd.* from temp_termspastdue tmp join (select s.loan_no,s.ps_due_dt, loan.cust_id, loan.loan_grd, loan.loan_actv_dt, loan.orig_prcp, loan

oracle点知识8——索引组织表

关于索引的入门参照博客:http://blog.csdn.net/changyanmanman/article/details/7097318 索引组织表(index organized table, IOT)就是存储在一个索引结构中的表.存储在堆中的表是无组织的(也就是说,只要有可用的空间,数据可以放在任何地方),IOT中的数据则按主键存储和排序.对你的应用来说,IOT表和一个"常规"表并无二致. IOT有什么意义呢?使用堆组织表时,我们必须为表和表主键上的索引分别留出空间.而IOT

数据库-navicat for oracle里报表和计划这两个是按钮是什么功能?

问题描述 navicat for oracle里报表和计划这两个是按钮是什么功能? 开发"> 表 查看当前数据库的表 试图 相当于临时表 函数 在Oracle里写的程序 数据泵 导入导出数据 查询 写SQL语句 报表 ? 计划 ? 模型 创建数据库模型,可以形成SQL 解决方案 报表 对数据进行统计 计划 定时的任务

Oracle删除当前用户下所有表的方法适用于有或没有删除权限_oracle

1.如果有plsql客户端,则可以使用该用户登录,选中所有表 右键Drop即可. 2.如果有删除用户的权限,则可以: drop user user_name cascade; 加了cascade就可以把用户连带的数据全部删掉. 删除后再创建该用户. --创建用户 create user 用户名 profile default identified by 密码 default tablespace 表空间名称 temporary tablespace TEMP account unlock; --