2011-02-28 67 views
5

我想要符合特定名稱條件的所有表中的記錄數。這裏是我建對PLSQL中的每個表執行

Declare SQLStatement VARCHAR (8000) :=''; 
BEGIN 
    SELECT 'SELECT COUNT (*) FROM ' || Table_Name || ';' 
    INTO SQLStatement 
    FROM All_Tables 
    WHERE 1=1 
    AND UPPER (Table_Name) LIKE UPPER ('MSRS%'); 

    IF SQLStatement <> '' THEN 
    EXECUTE IMMEDIATE SQLStatement; 
    END IF; 
END; 
/

的SQL,但我得到了以下錯誤:

Error at line 1 
ORA-01422: exact fetch returns more than requested number of rows 
ORA-06512: at line 3 
Script Terminated on line 1. 

如何修改這一點,以便它運行所有匹配的表?

更新:

根據收到的答覆,我試過以下,但如果你從all_tables你不能選擇我不會在DBMS_OUTPUT

declare 
    cnt number; 
begin 
    for r in (select table_name from all_tables) loop 
    dbms_output.put_line('select count(*) from CDR.' || r.table_name); 
    end loop; 
end; 
/
+1

確保您的動態聲明末尾沒有分號。如果你有它立即執行立即將返回一個錯誤。 – 2011-02-28 14:09:47

+2

您是否啓用了dmbs輸出?可能需要先做這件事才能看到你的輸出。 – 2011-02-28 14:10:55

回答

9
declare 
    cnt number; 
begin 
    for r in (select owner, table_name from all_tables 
      where upper(table_name) like ('%MSRS%')) loop 

    execute immediate 'select count(*) from "' 
      || r.owner || '"."' 
      || r.table_name || '"' 
      into cnt; 

    dbms_output.put_line(r.owner || '.' || r.table_name || ': ' || cnt); 
    end loop; 
end; 
/

得到什麼指望從表名中選擇必要的補助金。因此,您應該檢查拋出的ORA-00942: table or view does not exist錯誤。

至於你的錯誤的原因:你得到這個錯誤,因爲select語句返回一個結果集有多個行(每個表一個),你不能將這樣的結果集分配給varchar2。

順便說一句,請確保在執行此塊之前啓用dbms_output與SET SERVEROUT ON

+0

我可以訪問所有表格。 – 2011-02-28 13:48:28

+4

該解決方案忽略了存在兩個具有相同名稱但擁有不同所有者的表的可能性。 – Allan 2011-02-28 16:19:23

+0

希望你不介意我的編輯:) – 2011-03-01 00:59:01