现在我有个一个索引表是这样的
ID TableName
1 Tab1
2 Tab2
3 Tab3
......Tab1、Tab2、Tab3.....这些表个结构都是一样的,且可能不断扩充,就是说索引表记录也是不断扩大的。
有没有办法可以根据这个索引表,取出所有的TableName,把这些表用union 拼成一个Viewselect * from Tab1
union
select * from Tab2
union
select * from Tab3
........关键在TableName的个数不定,要根据索引表取。高手救救急啊
ID TableName
1 Tab1
2 Tab2
3 Tab3
......Tab1、Tab2、Tab3.....这些表个结构都是一样的,且可能不断扩充,就是说索引表记录也是不断扩大的。
有没有办法可以根据这个索引表,取出所有的TableName,把这些表用union 拼成一个Viewselect * from Tab1
union
select * from Tab2
union
select * from Tab3
........关键在TableName的个数不定,要根据索引表取。高手救救急啊
如果用procedure的话可以达到这种效果吗?
只要能实现这个目的,采用那种手段无所谓。
感谢楼上的!
sqlstr varchar2(2000) := '';
begin
for c1 in (select tablename from 索引表)
loop
sqlstr := sqlstr || ' select * from ' || c1.tablename || ' union';
end loop;
sqlstr := rtrim(sqlstr,' union');
execute immediate sqlstr;
end;
/
select * from (select TableName from Table_test);
和
select TableName from Table_test
一样[Quote=引用 7 楼 BlueskyWide 的回复:]
try:
select * from (select TableName from Table_test);
select * from (select TableName from Table_test); --是取所有表中的具体记录。
SQL> SELECT 'SELECT * FROM '||TABLENAME||' UNION' SQL_STATEMENT
2 FROM TABLE_NAME TT;SQL_STATEMENT
------------------------
SELECT * FROM TAB1 UNION
SELECT * FROM TAB2 UNION
SELECT * FROM TAB3 UNION
/--如果id按序从小到大排列,索引表的名称为Testselect decode(TableName, 'select * from ' || TableName) ||
decode(max(id), ';', 'union')
from Test;
/--在pl/sql或sqlplus中执行完上面的语句后,按回车。
/--如果id按序从小到大排列,索引表的名称为Testselect decode(TableName, 'select * from ' || TableName) ||
decode(max(id), ';', ' union ')
from Test;
/--在pl/sql或sqlplus中执行完上面的语句后,按回车。
1.通过如下的方法获取完整sql:
SELECT 'select * from ' || TABLENAME || DECODE(Z.ID, X.ID, ';', ' union ')
FROM (SELECT ID, TABLENAME FROM YOURTABLE) Z,
(SELECT MAX(ID) ID FROM YOURTABLE) X;
2.把上面获取的内容放到你程序中的对应位置.