Получать подсчеты всех таблиц в схеме
Я пытаюсь получить количество отсчетов всех таблиц в схеме. У меня возникли проблемы с написанием PL/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;
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;
Ответы
Ответ 1
Это должно сделать это:
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;
Я удалил различные ошибки из вашего кода.
Ответ 2
Это можно сделать с помощью одного оператора и некоторого 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'
Ответ 3
select owner, table_name, num_rows, sample_size, last_analyzed from all_tables;
Это самый быстрый способ получить количество строк, но есть несколько важных оговорок:
- NUM_ROWS на 100% точнее, если статистика была собрана в 11g и выше с
ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE
(по умолчанию) или в более ранних версиях с ESTIMATE_PERCENT => 100
. См. этот пост для объяснения того, как
алгоритм AUTO_SAMPLE_SIZE работает в 11g.
- Результаты были сгенерированы как
LAST_ANALYZED
, текущие результаты могут быть разными.
Ответ 4
Если вам нужен простой SQL для Oracle (например, XE без XmlGen), перейдите на простой 2-шаг:
select ('(SELECT ''' || table_name || ''' as Tablename,COUNT(*) FROM "' || table_name || '") UNION') from USER_TABLES;
Скопируйте весь результат и замените последний UNION точкой с запятой (';'). Затем в качестве второго шага выполните полученный SQL.
Ответ 5
Вы должны использовать execute немедленный (динамический 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;
Ответ 6
Получить количество всех таблиц в схеме и порядок по desc
select 'with tmp(table_name, row_number) as (' from dual
union all
select 'select '''||table_name||''',count(*) from '||table_name||' union ' from USER_TABLES
union all
select 'select '''',0 from dual) select table_name,row_number from tmp order by row_number desc ;' from dual;
Скопируйте весь результат и выполните