2013-03-11 98 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會負責將這些數據拉入。

相關問題