스키마에 있는 모든 테이블의 개수를 가져옵니다.
스키마 내의 모든 테이블의 레코드 카운트를 가져오려고 합니다.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;
이것이 행 카운트를 취득하는 가장 빠른 방법이지만 몇 가지 중요한 경고가 있습니다.
- NUM_ROWS는 통계가 11g 이상에서 수집된 경우 100% 정확합니다.
ESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE(디폴트) 또는 이전 버전에서는ESTIMATE_PERCENT => 10011g에서의 AUTO_SAMPLE_SIZE 알고리즘의 동작에 대해서는, 이 투고를 참조해 주세요. - 현재 결과가 생성되었습니다.
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
'programing' 카테고리의 다른 글
| 인수가 이 문자열과 같으면 이 문자열과 같은 변수를 정의합니다. (0) | 2023.04.09 |
|---|---|
| iPhone은 사용할 수 없습니다.장치를 다시 연결하십시오. (0) | 2023.04.09 |
| WaitUntilAllTasksAreFinished 오류 Swift (0) | 2023.04.04 |
| wp-rest api 응용 프로그램에서 wordpress nonce를 사용할 수 없습니다. (0) | 2023.04.04 |
| Web API Put Request가 Http 405 Method Not Allowed 오류를 생성합니다. (0) | 2023.04.04 |