如何从以字母A开头的所有表中查看ALL COLUMNS(所有表中的相同列名)?

时间:2013-03-11 02:28:01

标签: database oracle oracle10g

这可能吗?我使用的是ORACLE 10g。

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

所有这些表格都有“相同的名字” 例如:姓名,年龄,地点

(注意:列名相同但不是列中的值)。

在END ...我想查看来自的所有数据:名称,年龄,位置FROM所有以字母A开头的表格。

(注2:所有以字母A开头的表格都不是静态的,它们是动态的,意味着可能会发生不同的更改。例如:可以删除A01到A10,可以添加A99。

很抱歉没有澄清。

4 个答案:

答案 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会负责将这些数据拉进去。