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月
......求存储过程
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月
......求存储过程
调试欢乐多
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;
create or replace procedure fenge(beginmonth date)
isbegin
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
--修改一下,忘记 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;
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'不可以么?
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'')'
----四个单引号的意思是一样的实际上是将一个【'】连接,字符串两边增加【''】里面的【'】变为【''】
-----最后变为【''''】
进入procedures 测试执行后, 提示 这行
execute immediate 'create table A'|| to_char(rec.logdate,'yyyymm')
invalid character
字符串拼接多练练
报 invalid character 错误,
请指教哪里有问题?
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后面的标点问题。