orcle中的表按小时生成,如A-2007031400,A-2007031401,...,A-2007031423,A-2007031500,A-2007031501,...,A-2007031523...等,其结构相同,能不能做到用“A”代替访问以“A”开头的表? 如,我只需要 select * from A 就可以访问oracle中以“A”开头的表。
用select * from A实现访问所有A开头的表么? 那怎么输出查询结果啊... 都是A的结果,你怎么清楚是来自哪个表的?
建议使用分区表,表名为A,分区字段为A-XXXXXXXXXX
select * from A; 不是用来访问表A中的内容吗?
用select * from A实现访问所有A开头的表么? 那怎么输出查询结果啊... 都是A的结果,你怎么清楚是来自哪个表的? 不需要知道来自哪个表?我只是要访问他们的总和,为的就是避免这样: select * from A-2007031400 select * from A-2007031401 ..... 无数个。
建立同义词咯。 CREATE SYNONYM A FOR A-2007031400 。 。 。
SQL> create table A20060101 (id number, name varchar2(20));Table createdSQL> insert into A20060101 values(1, 'A20060101');1 row insertedSQL> create table A20060901 (id number, name varchar2(20));Table createdSQL> insert into A20060901 values(1, 'A20060901');1 row insertedSQL> commit;Commit complete SQL> create or replace procedure testpro as 2 str varchar2(30000); 3 num number; 4 begin 5 execute immediate ' grant create view to db2inst2 '; //db2inst2 is username 6 str := 'create view A as '; 7 for y in (select table_name from user_tables where table_name like 'A%') 8 loop 9 str := str || 'select * from ' || y.table_name || ' union all '; 10 end loop; 11 num := length(str); 12 str := substr(str, 0, num - 10); 13 execute immediate str ; 14 end; 15 /Procedure created SQL> exec testpro;PL/SQL procedure successfully completedSQL> select * from a; ID NAME ---------- -------------------- 1 A20060101 1 A20060901然后创建一个job,定时执行这个存储过程就可以通过直接防问A来访问A开头的所有表
考虑分区表吧,按照时间分区举例: create table test ( id number primary key, name varchar2(20), rq date ) partition by range (rq) ( partition rq_00 values less than(to_date('2006-01-01','yyyy-mm-dd')) tablespace xy, partition rq_01 values less than('2007-01-01','yyyy-mm-dd') tablespace xy1, partition rq_02 values less than(maxvalue) tablespace xy2 )
定义一个Job,一定时间段去执行一次testpro就可以了 不需要再做什么啊
首先要说的就是没有很好的方法,从这么多个表中select数据集。 建议还是使用分区表,按小时增加表不如按小时增加分区。 建个分区表A,就可直接select * from A;
那怎么输出查询结果啊... 都是A的结果,你怎么清楚是来自哪个表的?
不是用来访问表A中的内容吗?
那怎么输出查询结果啊... 都是A的结果,你怎么清楚是来自哪个表的?
不需要知道来自哪个表?我只是要访问他们的总和,为的就是避免这样:
select * from A-2007031400
select * from A-2007031401
.....
无数个。
CREATE SYNONYM A FOR A-2007031400
。
。
。
SQL> create or replace procedure testpro as
2 str varchar2(30000);
3 num number;
4 begin
5 execute immediate ' grant create view to db2inst2 '; //db2inst2 is username
6 str := 'create view A as ';
7 for y in (select table_name from user_tables where table_name like 'A%')
8 loop
9 str := str || 'select * from ' || y.table_name || ' union all ';
10 end loop;
11 num := length(str);
12 str := substr(str, 0, num - 10);
13 execute immediate str ;
14 end;
15 /Procedure created
SQL> exec testpro;PL/SQL procedure successfully completedSQL> select * from a; ID NAME
---------- --------------------
1 A20060101
1 A20060901然后创建一个job,定时执行这个存储过程就可以通过直接防问A来访问A开头的所有表
******************************
是以A开头所有表的所有记录。
create table test
(
id number primary key,
name varchar2(20),
rq date
)
partition by range (rq)
(
partition rq_00 values less than(to_date('2006-01-01','yyyy-mm-dd')) tablespace xy,
partition rq_01 values less than('2007-01-01','yyyy-mm-dd') tablespace xy1,
partition rq_02 values less than(maxvalue) tablespace xy2
)
不需要再做什么啊
建议还是使用分区表,按小时增加表不如按小时增加分区。
建个分区表A,就可直接select * from A;
不过还是建立分区表比较好