programing

스키마에 있는 모든 테이블의 개수를 가져옵니다.

javajsp 2023. 4. 4. 20:59

스키마에 있는 모든 테이블의 개수를 가져옵니다.

스키마 내의 모든 테이블의 레코드 카운트를 가져오려고 합니다.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 개의 스테이트먼트와 몇개의 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'

이것으로 충분합니다.

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;

당신의 코드에서 다양한 버그를 제거했습니다.

주의: 다른 독자를 위해 Oracle은 다음 를 제공하지 않습니다.STATS_TABLE를 작성해야 합니다.

select owner, table_name, num_rows, sample_size, last_analyzed from all_tables;

이것이 행 카운트를 취득하는 가장 빠른 방법이지만 몇 가지 중요한 경고가 있습니다.

  1. NUM_ROWS는 통계가 11g 이상에서 수집된 경우 100% 정확합니다.ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE(디폴트) 또는 이전 버전에서는ESTIMATE_PERCENT => 10011g에서의 AUTO_SAMPLE_SIZE 알고리즘의 동작에 대해서는, 투고를 참조해 주세요.
  2. 현재 결과가 생성되었습니다.LAST_ANALYZED현재 결과는 다를 수 있습니다.

Oracle용 단순한 SQL(XmlGen이 없는 XE 등)을 원하는 경우 간단한 2단계로 진행합니다.

select ('(SELECT ''' || table_name || ''' as Tablename,COUNT(*) FROM "' || table_name || '") UNION') from USER_TABLES;

전체 결과를 복사하고 마지막 UNION을 세미콜론(';')으로 바꿉니다.그런 다음 두 번째 단계에서 결과 SQL을 실행합니다.

스키마에 있는 모든 테이블의 개수를 가져오고 설명별로 정렬합니다.

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;

전체 결과 복사 및 실행

execute immediate(다이나믹 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; 

언급URL : https://stackoverflow.com/questions/10704808/get-counts-of-all-tables-in-a-schema