2011-02-28 64 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

相关问题