2011-02-28 20 views
5

Quiero el número de registros en todas las tablas que coinciden con un criterio de nombre específico. Aquí está el SQL he construidoEjecutar para cada tabla en 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; 
/

pero me da el siguiente error:

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. 

¿Cómo modifico este modo que se ejecuta para todas las tablas a juego?

Actualización:

Sobre la base de una respuesta recibida, He intentado lo siguiente pero no se consigue nada en el 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

Asegúrese de no tener punto y coma al final de su declaración dinámica. Execute inmediato devolverá un error si lo tiene allí. –

+2

¿Tiene habilitada la salida de dmbs? Es posible que deba hacer eso primero para ver su resultado. –

Respuesta

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

Si usted está seleccionando a partir all_tables no se puede contar con las becas necesarias para seleccionar del nombre de la tabla. Por lo tanto, debe comprobar si se ha producido el error ORA-00942: table or view does not exist.

En cuanto a la causa de su error: Obtiene este error porque la instrucción select devuelve un conjunto de resultados con más de una fila (uno para cada tabla) y no puede asignar dicho conjunto de resultados a varchar2.

Por cierto, asegúrese de habilitar dbms_output con SET SERVEROUT ON antes de ejecutar este bloque.

+0

Tengo acceso a todas las tablas. –

+4

Esta solución ignora la posibilidad de que existan dos tablas con el mismo nombre, pero diferentes propietarios. – Allan

+0

Espero que no te importe mi edición :) –

Cuestiones relacionadas