2014-01-16 20 views
0

的模式的所有表我將獲得許多模式的所有表,其中每個表都包含它所包含的行數。我想是這樣的:Oracle請求選擇行數爲

SELECT OWNER, TABLE_NAME, COUNT(TABLE_NAME) 
FROM DBA_USERS 
WHERE OWNER IN ('TOTO', 'TITI'); 

我必須做與請求「/ SYSDBA身份」,這就是爲什麼我嘗試使用DBA_USERS表。 你知道我爲什麼可以這樣做嗎?

感謝您的幫助,

史蒂夫

+0

這個問題是獲得_a_模式的所有表;這一個是獲得_many_ scemas的所有表。我不知道甲骨文,所以我不能分辨這個問題的答案是否適用於這個問題。 –

+0

@WayneConrad - 他們做了一些小小的調整;在Rob的回答中,只需使用'dba_tables'而不是'user_tables',並將'owner'添加到count中的表名中。 –

回答

0

使用

SELECT OWNER, TABLE_NAME, NUM_ROWS 
FROM DBA_TABLES 
WHERE OWNER IN ('TOTO', 'TITI'); 

它不是由SYS用戶需要,所有你需要的是SELECT ANY DICTIONARY特權。

注意:列NUM_ROWS不一定顯示確切的行數,它只是基於收集的統計數字的數字。爲了獲得每個表的確切編號,您必須編寫動態SQL語句。

UPDATE:

對於確切的數,您可以創建一個功能:

CREATE FUNCTION COUNT_ROWS(TABLE_NAME IN VARCHAR2) RETURN NUMBER IS 
    res NUMBER; 
BEGIN 
    EXECUTE IMMEDIATE 'SELECT COUNT(*) FROM '||TABLE_NAME INTO res; 
    RETURN res; 
END COUNT_ROWS; 
/

SELECT OWNER, TABLE_NAME, NUM_ROWS, Count_rows(OWNER||'.'||TABLE_NAME) as num_rows_exact 
FROM DBA_TABLES 
WHERE OWNER IN ('TOTO', 'TITI'); 

要知道,如果你的架構包含了許多數據的多個表,此查詢可能需要一些時間來執行。

+0

的確,這是我不想做的,使用num_rows。你知道如何動態地做到這一點嗎? – user2269756