una - ver todas las bases de datos en oracle
Obtenga recuentos de todas las tablas en un esquema (5)
Esto debería hacerlo:
declare
v_count integer;
begin
for r in (select table_name, owner from all_tables
where owner = ''SCHEMA_NAME'')
loop
execute immediate ''select count(*) from '' || r.table_name
into v_count;
INSERT INTO STATS_TABLE(TABLE_NAME,SCHEMA_NAME,RECORD_COUNT,CREATED)
VALUES (r.table_name,r.owner,v_count,SYSDATE);
end loop;
end;
Eliminé varios errores de tu código.
Estoy tratando de obtener el recuento de registros de todas las tablas en un esquema. Tengo problemas para escribir PL / SQL. Esto es lo que hice hasta ahora, pero estoy recibiendo errores. Por favor sugiera cualquier cambio:
DECLARE
v_owner varchar2(40);
v_table_name varchar2(40);
cursor get_tables is
select distinct table_name,user
from user_tables
where lower(user) = ''SCHEMA_NAME'';
begin
open get_tables;
fetch get_tables into v_table_name,v_owner;
INSERT INTO STATS_TABLE(TABLE_NAME,SCHEMA_NAME,RECORD_COUNT,CREATED)
SELECT v_table_name,v_owner,COUNT(*),TO_DATE(SYSDATE,''DD-MON-YY'') FROM v_table_name;
CLOSE get_tables;
END;
Esto se puede hacer con una declaración única y algo de magia XML:
select table_name,
to_number(extractvalue(xmltype(dbms_xmlgen.getxml(''select count(*) c from ''||owner||''.''||table_name)),''/ROWSET/ROW/C'')) as count
from all_tables
where owner = ''FOOBAR''
Si desea SQL simple para Oracle (p. Ej., Tenga XE sin XmlGen) vaya por un simple paso de 2 pasos:
select (''(SELECT '''''' || table_name || '''''' as Tablename,COUNT(*) FROM "'' || table_name || ''") UNION'') from USER_TABLES;
Copia el resultado completo y reemplaza la última UNIÓN con un punto y coma ('';''). Luego, como segundo paso, ejecuta el SQL resultante.
Tienes que usar execute immediate (dynamic sql).
DECLARE
v_owner varchar2(40);
v_table_name varchar2(40);
cursor get_tables is
select distinct table_name,user
from user_tables
where lower(user) = ''schema_name'';
begin
open get_tables;
loop
fetch get_tables into v_table_name,v_owner;
EXIT WHEN get_tables%NOTFOUND;
execute immediate ''INSERT INTO STATS_TABLE(TABLE_NAME,SCHEMA_NAME,RECORD_COUNT,CREATED)
SELECT '''''' || v_table_name || '''''' , '''''' || v_owner ||'''''',COUNT(*),TO_DATE(SYSDATE,''''DD-MON-YY'''') FROM '' || v_table_name;
end loop;
CLOSE get_tables;
END;
select owner, table_name, num_rows, sample_size, last_analyzed from all_tables;
Esta es la forma más rápida de recuperar los conteos de filas, pero hay algunas advertencias importantes:
- NUM_ROWS solo es 100% exacto si las estadísticas se recopilaron en 11g y superiores con
ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE
(valor predeterminado) o en versiones anteriores conESTIMATE_PERCENT => 100
. Consulte esta publicación para obtener una explicación de cómo funciona el algoritmo AUTO_SAMPLE_SIZE en 11g. - Los resultados se generaron a partir de
LAST_ANALYZED
, los resultados actuales pueden ser diferentes.