把一个表按照时间不同分成N张表

河蟹哥哥 2011-07-07 08:44:38
db1数据库 db2数据库
A表(a,b,c,d,t) t是时间, A1表(a,c,d,b,t) t 是XX年1月
A2表(a,c,d,b,t) t 是XX年2月
......

求存储过程
...全文
313 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
yiyimickey 2011-09-01
  • 打赏
  • 举报
回复
如需要阅读该回复,请登录或注册CSDN!

6楼的内容为什么看不到呢???
河蟹哥哥 2011-07-10
  • 打赏
  • 举报
回复
自己顶一下
河蟹哥哥 2011-07-10
  • 打赏
  • 举报
回复
问题解决,结贴散分
河蟹哥哥 2011-07-09
  • 打赏
  • 举报
回复
测试时还是报错,ORA-01898 提示精确度说明符过多。

自己建了个简化的 环境
create or replace procedure chuangjian
(v_id in varchar)
is
begin
if v_id = to_char(1,9)
then
execute immediate
'create table A1 as select * from a'|| ';';
end if ;
end;
之前 v_id 是 number 型,执行时 exec chuangjian(1),报错。 现在全部换成字符型,
存储过程执行成功,但是表A1没有出现。我想可能都是execute immediate后面的标点问题。
BenChiM888 2011-07-08
  • 打赏
  • 举报
回复

--修改一下,忘记 rec.logdate 拼接后变成字符串了
--要修改为拼接后的结果为 to_date(rec.logdate,'xxxxxxx) 这样的
--修改如下

begin
for rec in(select distinct trunc(t,'dd') logdate from a)
loop
execute immediate 'create table A'|| to_char(rec.logdate,'yyyymmdd')
||' as select * from A where A.t >= '
||'to_date('''
|| to_char(rec.logdate,'yyyy-mm-dd')
||''',''yyyy-mm-dd'')'
||' and A.t < '
||' to_date('''
|| to_char(rec.logdate + 1,'yyyy-mm-dd')
||''',''yyyy-mm-dd'')'
|| ';';
end loop;
end;


河蟹哥哥 2011-07-08
  • 打赏
  • 举报
回复
我按照本地的情况修改了一下
create or replace procedure fenge

(beginmonth date)
is

begin
for rec in(select distinct trunc(begin_date,'mm') beginmonth from ow_cyclebill)
loop
execute immediate 'create table ow_cyclebill'||to_char(rec.beginmonth,'yyyymm')

||' as select * from ow_cyclebill where ow_cyclebill.begin_date >= '
|| rec.beginmonth
||' and ow_cyclebill.begin_date < '
|| rec.beginmonth + 1
|| ';';
end loop;
end;

执行后提示 execute immediate 这一行错误numeric or value error: character to number conversion error
BenChiM888 2011-07-08
  • 打赏
  • 举报
回复
我回答的已经很明白了,仔细看看。
河蟹哥哥 2011-07-08
  • 打赏
  • 举报
回复
存储过程执行到这行出错了
报 invalid character 错误,
请指教哪里有问题?
wori011 2011-07-08
  • 打赏
  • 举报
回复
execute immediate 'create table A'|| to_char(rec.logdate,'yyyymm')
字符串拼接多练练
河蟹哥哥 2011-07-08
  • 打赏
  • 举报
回复
自己建立了表A,存储过程,
进入procedures 测试执行后, 提示 这行
execute immediate 'create table A'|| to_char(rec.logdate,'yyyymm')
invalid character
BenChiM888 2011-07-08
  • 打赏
  • 举报
回复

begin
for rec in(select distinct trunc(t,'mm') logdate from a)
loop
execute immediate 'create table A'|| to_char(rec.logdate,'yyyymm')
||' as select * from A where A.t >= '
||'to_date('''
|| to_char(rec.logdate,'yyyy-mm')
||''',''yyyy-mm'')'
||' and A.t < '
||' to_date('''
|| to_char(add_months(rec.logdate,1),'yyyy-mm')
||''',''yyyy-mm'')'
|| ';';
end loop;
end;




3.还有execute immediate 'create table A'|| to_char(rec.logdate,'yyyymmdd')
这里的|| 后面的空格应该不要的把,组成新的表名a201010
--后面没有空格A||B 和 A|| B 是一样的, A||' '||B 就带空格了。

4.很多'''' 引号为什么还要打三个,||后面一个引号够了吧。 中间的''yyyy-mm-dd''用'yyyy-mm-dd'不可以么?
--因为最终要连接出 to_date(字段,'yyyy-mm') 这样的字符串来,在连接的时候,外面需要再加'',即
--'拼接结果',而在''里面是要用两个连续的单引号代表一个单引号的。
--如,||''',''yyyy-mm'')' 表达的意思是将字符串 【','yyyy-mm')】连接上去,
----而oracle中表示字符串用单引号表示【''】,因此需要在两边增加单引号,
----而一旦增加单引号了,里面【','yyyy-mm')】的单引号要全部改为双引号【'',''yyyy-mm'')】
----然后两边加单引号表示字符串就变成了 ''',''yyyy-mm'')'
----四个单引号的意思是一样的实际上是将一个【'】连接,字符串两边增加【''】里面的【'】变为【''】
-----最后变为【''''】

河蟹哥哥 2011-07-08
  • 打赏
  • 举报
回复
小弟初学,调试不通,有些不明白。
1.要求是按月分表 如a201010,a201011.....,不是按日,
2.后面的to_char(rec.logdate + 1,'yyyy-mm-dd') 应该改为|| to_char(to_char(rec.beginmonth,'yyyymm')+1)

3.还有execute immediate 'create table A'|| to_char(rec.logdate,'yyyymmdd')
这里的|| 后面的空格应该不要的把,组成新的表名a201010
4.很多'''' 引号为什么还要打三个,||后面一个引号够了吧。 中间的''yyyy-mm-dd''用'yyyy-mm-dd'不可以么?
tangren 2011-07-07
  • 打赏
  • 举报
回复
不用生成这么多表,管理和数据处理都很麻烦!
如果A表数据量较大,按月进行分区就行了,可以提高查询和管理的效率。
并且,如果使用按月分区后,你可以查询时指定具体的分区,如同一张独立的表一样使用。
BenChiM888 2011-07-07
  • 打赏
  • 举报
回复

begin
for rec in(select distinct trunc(t,'dd') logdate from a)
loop
execute immediate 'create table A'|| to_char(rec.logdate,'yyyymmdd')
||' as select * from A where A.t >= '
|| rec.logdate
||' and A.t < '
|| rec.logdate + 1
|| ';';
end loop;
end;

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧