2011-02-28 17 views
5

Belirli bir ad ölçütüyle eşleşen tüm tablolardaki kayıt sayısını istiyorum. İştePLSQL'de Her Bir Tablo İçin Yürüt

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; 
/

inşa SQL olduğu Fakat aşağıdaki hatayı alıyorum: çalışır, böylece

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. 

nasıl eşleşen tüm tablolar için bu değiştiririm?

Güncelleme: bir cevap aldı dayanarak

, şu çalıştım ama bunu yapamazsınız all_tables seçerek ediyorsanız ben 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

Dinamik ifadenizin sonunda yarı kalın harf olmadığından emin olun. Hemen yürütme, orada varsa bir hata döndürür. –

+2

Dmbs çıkışı etkin mi? Çıktınızı görmek için önce bunu yapmanız gerekebilir. –

cevap

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; 
/

şey alamadım Tablo isminden seçim yapmak için gerekli hibelere sahip olduğunuzu dikkate alın. Bu nedenle atılan ORA-00942: table or view does not exist hatasını kontrol etmeniz gerekir.

Hatanızın nedeni hakkında: Bu hata, select deyimi birden fazla satır içeren bir sonuç kümesi (her tablo için bir tane) döndürdüğünden ve bu tür bir sonuç kümesini varchar2'ye atayamayacağınız için bu hatayı alıyorsunuz. Bu bloğu yürütmeden önce, dbms_output öğesini SET SERVEROUT ON ile etkinleştirdiğinizden emin olun.

+0

Tüm tablolara erişimim var. –

+4

Bu çözüm, aynı adla, ancak farklı sahiplerle var olan iki tablo olasılığını göz ardı eder. – Allan

+0

Umarım benim düzenlemelerimi umursamıyorum :) –