2013-03-11 127 views
0

这可能吗?我正在使用ORACLE 10g。如何查看以字母A开头的所有表中的所有列(所有表中的列名相同)?

例如:我有50个表名A01,A02,A03,A04 ......... A50。

而且这些表都具有“相同的列名” 例如:姓名,年龄,位置

(注:列名是相同的,但不是在列的值)。

到底......我想从查看所有数据:姓名,年龄,位置,所有表中开始以字母A.

(注2:所有表开头字母A不是静态的,它们是动态的,可能会发生不同的变化。例如:A01到A10可以被删除,A99可以被添加)。

对不起,不澄清。

回答

0

按我的理解,如果你想查看以A开头的表中的所有列名,那么试试下面

select column_name,table_name from user_tab_cols where table_name like 'A%'; 

如果你的要求是别的东西,然后明确指定。

+0

Sir Aspirant,抱歉没有澄清我想要的结果输出。那么我发布了关于我的话题的增加信息。顺便说一下,先生,我没有得到任何输出。 :| – 2013-03-11 02:58:09

+0

@GlennHolmgren - 如果你没有得到任何输出,那么这意味着你没有任何以'A'开始的表格。也许你的规格是错误的? – APC 2013-03-11 09:09:03

+0

我确实有A和T的表格,我甚至尝试过T ...也许我犯了一些错误...我会在稍后检查,感谢主席先生的帮助。 – 2013-03-13 00:53:09

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 
+0

Sir peterm,我所使用的数据库表不是常量,而是动态的,它不时添加...... :( – 2013-03-11 02:56:21

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; 
+0

“... AND ALL_TABLES.DROPPED ='NO'”,也许。 – 2013-03-11 07:20:33

+0

谢谢叶戈尔爵士,我稍后会回顾你的剧本...:D谢谢!我稍后会更新你。 – 2013-03-13 00:53:51

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; 

注意你手动做什么,基本上是所谓的分区,和Oracle有一个超级巨大的支持已经可用于该出的盒子。即你可以拥有一个看起来像超级巨大的表,但是从技术上说,它存储为一组较小的表(和较小的索引),按分区标准进行分割。例如,如果您有数百万条支付记录,则可以按年分区,这样一张物理表只包含一组合理的数据。尽管如此,您可以自由选择,如果您打算从其他分区获取数据,Oracle会负责将这些数据拉入。

相关问题