sql动态拼接表名

lyhmy 2011-08-23 04:20:36

select 字段 from 表名 where 条件

注:
1、这个表名是动态需要拼接的:他的格式是XXX_月份_日期,即他前面的xxx是固定的,后面的是用日期拼接的,而他的日期是从界面上传过来的:
比如我选的日期是2011-08-22,那他的表名就应该是XXX_08_22,
如选择的是2011-08-23,那他的表名就应该是XXX_08_23,

2、同时如果起始时间和结束时间选择的是跨天的话那就应该查询出这几天的记录,可以用union all来进行组合,但是我不太明天他怎么去知道我选的日期间隔呢?? 比如如果我选2011-08-22,和2011-08-23 没有什么间隔,他能之间Union all查出这两天的,但是如果我选择的相隔了几天呢,比如选的是2011-08-20和2011-08-23 那他怎么就知道查这几天的然后在Union all呢



请各位大侠帮忙给点思路,谢谢了、、、、、、、、、、、、、、、
...全文
2925 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
雨天要吃饭 2011-09-15
  • 打赏
  • 举报
回复
太长了 就变成long类型的了,但是依然可以执行的啊。
opps_zhou 2011-08-27
  • 打赏
  • 举报
回复
[Quote=引用 15 楼 lyhmy 的回复:]
各位大侠,上面的基本可以了但同时也就有另一个问题:
拼接sql语句的那个变量类型是varchar2的,他长度有限(Oracle的varchar2类型最大长度为4000, PLSQL的varchar2最大长度为32767),过长的sql就不行了,请问有什么解决办法吗
[/Quote]

所以我建议是用分区表,和分区索引,这样性能优保证,同时也不需要用动态语句
xiaod_xx 2011-08-24
  • 打赏
  • 举报
回复
一天生成一张表- -!
为嘛要这样啊...
ksdy138141314 2011-08-24
  • 打赏
  • 举报
回复
用游标吧。
lyhmy 2011-08-24
  • 打赏
  • 举报
回复
各位大侠,上面的基本可以了但同时也就有另一个问题:
拼接sql语句的那个变量类型是varchar2的,他长度有限(Oracle的varchar2类型最大长度为4000, PLSQL的varchar2最大长度为32767),过长的sql就不行了,请问有什么解决办法吗
lyhmy 2011-08-24
  • 打赏
  • 举报
回复
不是的,因为数据量还是比较大的,所以才分多个数据源,一天一张表,那个表只是相应的某一天的数据,入库的时候也是这样的,不可能把所有的数据扔到一张表中的
ystemni 2011-08-24
  • 打赏
  • 举报
回复
人家的表一天一张,数据过来后你可以转储在一张表中啊,然后根据时间过滤下不就完了
不要悲剧人生 2011-08-23
  • 打赏
  • 举报
回复
很有想法。。
lyhmy 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 opps_zhou 的回复:]
引用 7 楼 lyhmy 的回复:
引用 6 楼 luoyoumou 的回复:
-- 悲哀,要是日期跨100天,我是不是要用 99 个 union all 呢?
-- 设计严重有问题!严重不合理!


是不太合理,用union all 只是我所想到的,没有要求一定要用这个的,我对Oracle不太熟,考虑问题也就不是太全面,那要怎样可以合理一些,在麻烦你给点提示了

这些数据为什么不……
[/Quote]
不是一张表,它是一天生成一张表的,而我查询的时候输入的那个日期就是表名的后缀,所以需要动态的来拼接, 至于你将的分区,我不是太明白,但是这边是需要根据选择的一个条件来查询不同的数据源的,它是有多个数据源
秋雨飘落 2011-08-23
  • 打赏
  • 举报
回复
--1.定义变量



start_time := sysdate; -------开始执行时间

v_tablename := 'JQ_SHI_FX_'||to_char(sysdate,'mmdd'); -------定义新的业务表名称

TABLE_NAME := 'FACT_110JQ_SHI_FX_NEW'; -------业务表名称



--2.创建业务表



c_sql := 'create table '||v_tablename||' tablespace ts_jqyq_yw as

opps_zhou 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lyhmy 的回复:]
引用 6 楼 luoyoumou 的回复:
-- 悲哀,要是日期跨100天,我是不是要用 99 个 union all 呢?
-- 设计严重有问题!严重不合理!


是不太合理,用union all 只是我所想到的,没有要求一定要用这个的,我对Oracle不太熟,考虑问题也就不是太全面,那要怎样可以合理一些,在麻烦你给点提示了
[/Quote]
这些数据为什么不放到一张表里呢?数据量太大的话可以使用分区表
lyhmy 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 luoyoumou 的回复:]
-- 悲哀,要是日期跨100天,我是不是要用 99 个 union all 呢?
-- 设计严重有问题!严重不合理!
[/Quote]

是不太合理,用union all 只是我所想到的,没有要求一定要用这个的,我对Oracle不太熟,考虑问题也就不是太全面,那要怎样可以合理一些,在麻烦你给点提示了
luoyoumou 2011-08-23
  • 打赏
  • 举报
回复
-- 悲哀,要是日期跨100天,我是不是要用 99 个 union all 呢?
-- 设计严重有问题!严重不合理!
yinan9 2011-08-23
  • 打赏
  • 举报
回复
放在PL/SQL语句块里面,按照你需要的不同情况,生成SQL语句,放在字符串里面。
EXECUTE IMMEDIATE SQL_Statement
lyhmy 2011-08-23
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 luoyoumou 的回复:]
-- 用存储过程去拼!
[/Quote]

那关于第二个问题呢,他如何知道我要查询的这几天的数据,在进行联合呢,用判断,在判断中循环吗???能不能在具体点、、、
BenChiM888 2011-08-23
  • 打赏
  • 举报
回复

--给你写个大概的思路
declare
v_str varchar2(4000); --拼接的sql
begin
--拼接sql
for i in 0..(enddate-begindate)
loop
v_str := v_str ||'select * from xxx_'||to_char(begindate,'mm_dd')+i||' union all';
end loop;
--去掉最后的union all
v_str := rtrim(v_str,'union all');
end;
opps_zhou 2011-08-23
  • 打赏
  • 举报
回复
简单给你写个例子



declare
-- 以下变量当做你传入的参数
in_begintime varchar2(20); --开始日期
in_endtime varchar2(20); --结束日期

-- 以下自定义变量
d_begintime date;
d_endtime date;

s_tabname varchar2(30) := 'TBL_XXX_';
s_sqlquery varchar2(4000) := '';
begin
in_begintime := '2011-08-20';
in_endtime := '2011-08-26';

d_begintime := to_date(in_begintime, 'yyyy-mm-dd');
d_endtime := to_date(in_endtime, 'yyyy-mm-dd');

while (d_begintime <= d_endtime)
loop
s_sqlquery := s_sqlquery || 'union all ' || chr(10)
|| 'select * from ' || s_tabname || to_char(d_begintime, 'mm_dd') || chr(10);

d_begintime := d_begintime + 1;
end loop;
s_sqlquery := substr(s_sqlquery, 12);
dbms_output.put_line(s_sqlquery);
end;
/

select * from TBL_XXX_08_20
union all
select * from TBL_XXX_08_21
union all
select * from TBL_XXX_08_22
union all
select * from TBL_XXX_08_23
union all
select * from TBL_XXX_08_24
union all
select * from TBL_XXX_08_25
union all
select * from TBL_XXX_08_26




luoyoumou 2011-08-23
  • 打赏
  • 举报
回复
-- 用存储过程去拼!

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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