在oracle中使用基表建立月表的存储过程
-- oracle环境的sql
-- 基础表准备
drop table base_config_monthly_table;
create table base_config_monthly_table
(
base_table_name varchar2(50),
valid_flag number(1) default 1,
remark varchar2(1000)
); select * from base_config_monthly_table ;
insert into base_config_monthly_table(base_table_name,valid_flag,remark)
select 'aa_wanglc_test',1,'王路长提供的样例' from dual;
commit; -- 待用函数的测试
SELECT REPLACE( '', substr('',4,4), '****') from dual;
select instr('abcdef','d') from dual;
select length('abdf') from dual;
select to_char(add_months(trunc(sysdate),-1),'yyyy') from dual;
select to_char(1,'fm00') from dual; CREATE TABLE aa_wanglc_test AS SELECT * FROM dual;
SELECT * FROM aa_wanglc_test;
CREATE INDEX idx_wt_d009091 ON aa_wanglc_test(dummy); -- 通过基表建立月表,且通过基表的索引建立月表的索引
CREATE OR REPLACE procedure proc_create_monthly_tables
AUTHID CURRENT_USER IS
v_base_monthly_table base_config_monthly_table%rowtype; -- 配置表
v_base_ddl varchar2(4000); -- 保存基表的sql
v_sql varchar2(4000); -- 最终需要使用的sql
v_new_tableName varchar2(50); -- 月表的表名
v_yyyy varchar2(10); --月表的年变量
v_month number := 0; --月表的月变量
v_current_month varchar2(10); -- 月份的循环变量
v_exists_flag number := 0;
v_base_table_name_upper varchar2(50); -- 大写格式的基表名字 cursor v_cur_get_basetable is
select * from base_config_monthly_table where valid_flag = 1; type cur_get_index is ref cursor; --声明一个动态游标类型,因为游标不是类型所以要声明一个动态游标类型,需要查询每个基表的索引
v_cur_get_index cur_get_index; --声明一个动态游标变量 v_index_ddl varchar2(4000); -- 建立索引的sql
v_index_name_str varchar2(30);
v_index_name_num NUMBER;
v_index_name varchar2(30);
v_old_index_name varchar2(30); begin
open v_cur_get_basetable;
loop
fetch v_cur_get_basetable
into v_base_monthly_table;
exit when v_cur_get_basetable%notfound; select to_char(sysdate,'yyyy') into v_yyyy from dual; select upper(v_base_monthly_table.base_table_name) into v_base_table_name_upper from dual;
--dbms_output.put_line(v_base_table_name_upper);
v_exists_flag := 0;
select count(*) into v_exists_flag from user_tables where table_name = v_base_table_name_upper ; -- 如果基表不存在,则不处理这条配置记录
if v_exists_flag = 0 then
continue;
end if; -- 在数据库系统取得基表的建表语句
SELECT DBMS_METADATA.GET_DDL('TABLE', v_base_table_name_upper)
into v_base_ddl
from dual; --dbms_output.put_line(v_base_ddl);
v_month := 0; loop
v_month := v_month +1;
exit when v_month > 12;
select to_char(v_month,'fm00') into v_current_month from dual;
v_new_tableName := v_base_table_name_upper||'_'||v_yyyy||v_current_month;
-- dbms_output.put_line(v_new_tableName); v_exists_flag := 0;
select count(*) into v_exists_flag from user_tables where table_name = upper(v_new_tableName)
or table_name = '"'||v_new_tableName||'"'; -- dbms_output.put_line(v_exists_flag);
-- 如果月表已经创建,则不再创建
if v_exists_flag > 0 then
continue;
end if; -- 用月表的表名来替换建表语句中的基表表名
SELECT REPLACE(v_base_ddl,
v_base_table_name_upper,
v_new_tableName)
into v_sql
from dual; --dbms_output.put_line(v_sql);
execute IMMEDIATE v_sql; -- 查找索引
v_sql := 'SELECT DBMS_METADATA.GET_DDL('''||CHR(73)||'NDEX'', index_name),index_name
FROM USER_INDEXES WHERE table_name = '''||v_base_table_name_upper||'''
AND UNIQUEness = ''NONUNIQUE''';
open v_cur_get_index for v_sql; -- 打开游标,并且SQL执行结果存放到游标
LOOP
fetch v_cur_get_index into v_index_ddl,v_old_index_name;
exit when v_cur_get_index%notfound; -- 退出循环 -- 为索引取一个名字,名字是随机取得
SELECT dbms_random.string ('x', 8) INTO v_index_name_str FROM dual;
select trunc(dbms_random.value(0,100000)) INTO v_index_name_num from dual;
v_index_name := 'idx_'||v_index_name_str||'_'||to_char(v_index_name_num); -- 把建立索引的语句中的索引名字改掉
SELECT REPLACE(v_index_ddl,
v_old_index_name,
v_index_name)
into v_sql
from dual; --dbms_output.put_line(v_sql);
-- 把建立索引的语句中的表名改掉
SELECT REPLACE(v_sql,
v_base_table_name_upper,
v_new_tableName)
into v_sql
from dual; --dbms_output.put_line(v_sql);
execute IMMEDIATE v_sql; END LOOP; -- 创建索引的动态游标结束
end loop;
end loop;
close v_cur_get_basetable;
end ; -- 查看存储过程是不是有错误
select * from user_errors; -- 执行存储过程
begin
proc_create_monthly_tables;
end; -- 查看效果
SELECT * FROM user_tables WHERE table_name LIKE upper('aa_wanglc_test%');
SELECT * FROM USER_indexes WHERE table_name LIKE upper('aa_wanglc_test%'); -- 删除测试表的语句
select 'drop table '|| table_name || ';' from user_tables where table_name like upper('aa_wanglc_test%');
在oracle中使用基表建立月表的存储过程的更多相关文章
- Oracle中解析XMLType格式字段
背景:项目从某数据交换平台获取XML数据,以Oracle的XMLType格式保存在数据库字段中,需要建立触发器.存储过程,在保存数据时解析XML字段,将数据写入其他业务表中. 参考资料:Oracle的 ...
- Oracle中建立物化视图报错
Oracle中建立物化视图报错 今天在建立视图的时候,报了一个错:ORA-01723: zero-length columns are not allowed. 建视图的语句: create mate ...
- 如何在Oracle中建立表和表空间?
1.建表空间 ORACLE中,表空间是数据管理的基本方法,所有用户的对象要存放在表空间中,也就是用户有空间的使用权,才能创建用户对象.否则是不充许创建对象,因为就是想创建对象,如表,索引等,也没有地方 ...
- ORACLE 中ROWNUM用法总结(转)
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- oracle中imp命令详解 .
转自http://www.cnblogs.com/songdavid/articles/2435439.html oracle中imp命令详解 Oracle的导入实用程序(Import utility ...
- ORACLE 中ROWNUM用法总结!
ORACLE 中ROWNUM用法总结! 对于 Oracle 的 rownum 问题,很多资料都说不支持>,>=,=,between...and,只能用以上符号(<.<=.!=) ...
- Oracle中的rownum用法解析
注意:rownum从1开始: 1.rownum按照记录插入时的顺序给记录排序,所以有order by的子句时一定要注意啊! 2.使用时rownum,order by字段是否为主键有什么影响? 3 ...
- 转:Oracle中的rownum不能使用大于>的问题
一.对rownum的说明 关于Oracle 的 rownum 问题,很多资料都说不支持SQL语句中的“>.>=.=.between...and”运算符,只能用如下运算符号“<.< ...
- oracle中imp命令具体解释
oracle中imp命令具体解释 Oracle的导入有用程序(Import utility)同意从数据库提取数据,而且将数据写入操作系统文件.imp使用的基本格式:imp[username[/pass ...
随机推荐
- python eval内置函数作用
功能:将字符串str当成有效的表达式来求值并返回计算结果. 语法: eval(source[, globals[, locals]]) -> value 参数: source:一个Python表 ...
- jvm出现OutOfMemoryError时处理方法/jvm原理和优化参考
The heap stores all of the objects created by your java program.The heap's contents is monitored by ...
- 第十三章·Kibana深入-使用地图统计客户端IP
地址库 在ELK中,我们可以使用地址库,来对IP进行分析,对日志进行分析,在ELKstack中只有Logstash可以做到,但是出图,是Kibana来出的,所以我们首先需要下载地址库数据文件,然后对L ...
- 基于MYCAT中间件实现MYSQL读写分离
基于mycat实现mysql读写分离 完成主从复制的配置 /* 主节点:192.168.47.101 从节点:192.168.47.102 */ /*mycat为同一网段客户端*/ /* 修改主节点基 ...
- java中有个很强大的工具jconsole.exe
这个工具可以监控java程序的线程,cpu和内存使用情况.
- Summer training #6
A:水.看0多还是1多就行 B:模拟二进制运算 ,,卡了好久 不应该 #include <bits/stdc++.h> #include <cstring> #include ...
- python 示例代码3
示例3:Python获取当前环境下默认编码(字符编码demo1.py) 字符编码,python解释器在加载py文件中的代码时,会对内容进行编码(默认ASCII),windows系统默认编码为GBK,U ...
- es聚合学习笔记
聚合可以做什么? count avg filter and count 每月新增 top 是否存在不正常或不符合规则的数据 关键概念 Buckets group by 将数据按某种标准划分成不同集合 ...
- PHP下查询游戏《Minecraft》多人游戏 服务器的人数。
废话不多说,直接上图: 作为一个优雅的Minecraft服务器,肯定需要官网的嗯. 很多服务器的官网都有显示当前服务器在线人数,延迟,每一个子服在线人数,甚至出了个流量图. 我们不搞花里胡哨的查询人数 ...
- java 枚举类(简单使用)
直接上代码 用法一(常量): package com.ou.test; import com.sun.corba.se.impl.util.SUNVMCID; public class Enum { ...