这可能吗?我使用的是ORACLE 10g。
例如:我有50个表名A01,A02,A03,A04 ......... A50。
所有这些表格都有“相同的名字” 例如:姓名,年龄,地点
(注意:列名相同但不是列中的值)。
在END ...我想查看来自列的所有数据:名称,年龄,位置FROM所有以字母A开头的表格。
(注2:所有以字母A开头的表格都不是静态的,它们是动态的,意味着可能会发生不同的更改。例如:可以删除A01到A10,可以添加A99。
很抱歉没有澄清。
答案 0 :(得分:2)
DECLARE
TYPE CurTyp IS REF CURSOR;
v_cursor CurTyp;
v_record A01%ROWTYPE;
v_stmt_str VARCHAR2(4000);
BEGIN
for rec in (
select table_name
from user_tables
where table_name like 'A%'
) loop
if v_stmt_str is not null then
v_stmt_str := v_stmt_str || ' union all ';
end if;
v_stmt_str := v_stmt_str || 'SELECT * FROM ' || rec.table_name;
end loop;
OPEN v_cursor FOR v_stmt_str;
LOOP
FETCH v_cursor INTO v_record;
EXIT WHEN v_cursor%NOTFOUND;
-- Read values v_record.name, v_record.age, v_record.location
-- Do something with them
END LOOP;
CLOSE v_cursor;
END;
答案 1 :(得分:0)
根据我的理解,如果要查看以A开头的表的所有列名,请尝试以下
select column_name,table_name from user_tab_cols where table_name like 'A%';
如果您的要求是其他要求,请明确说明。
答案 2 :(得分:0)
如果理解正确并且表格数量不变,那么您可以创建一次VIEW
CREATE VIEW vw_all
AS
SELECT name, age, location FROM A01
UNION ALL
SELECT name, age, location FROM A01
UNION ALL
...
SELECT name, age, location FROM A50
UNION ALL
然后使用它
SELECT *
FROM vw_all
WHERE age < 35
ORDER BY name
答案 3 :(得分:0)
这将返回您需要的所有表格:
select table_name
from user_tables
where table_name like 'A__';
由此,您可以构建动态sql语句:
select listagg('select * from '||table_name,' union all ') within group(order by table_name)
from user_tables
where table_name like 'A__'
这实际上返回一个包含所有表和联合的SQL语句:
select * from A01 union all select * from A02 union all select * from A03
最后通过本机动态sql执行此操作。你可以在PL / SQL中做到这一点,所以你需要一个函数:
create function getA
query varchar2(32000);
begin
select listagg('select * from '||table_name,' union all ') within group(order by table_name)
into query
from user_tables
where table_name like 'A__';
open res for query;
return res;
end;
请注意,您手动执行的操作基本上称为 partitioning ,并且Oracle已经为开箱即用提供了超级强大的支持。即你可以拥有一个看起来像超大表的东西,但从技术上讲,它存储为一组较小的表(和较小的索引),由分区标准分割。例如,如果您有数百万条支付记录,则可以按年划分,这样一个物理表只包含一组合理的数据。尽管如此,您仍然可以自由选择,如果您正在从其他分区中获取数据,那么Oracle会负责将这些数据拉进去。