40

スキーマ内のすべてのテーブルのレコード数を取得しようとしています。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;
4

6 に答える 6

66

これは、単一のステートメントといくつかの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'
于 2012-05-22T15:24:24.150 に答える
30

これはそれを行う必要があります:

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を作成する必要があります。

于 2012-05-22T15:22:24.620 に答える
9
select owner, table_name, num_rows, sample_size, last_analyzed from all_tables;

これは行数を取得するための最速の方法ですが、いくつかの重要な注意事項があります。

  1. NUM_ROWSは、統計が11g以上でESTIMATE_PERCENT => DBMS_STATS.AUTO_SAMPLE_SIZE(デフォルト)を使用して収集された場合、または以前のバージョンで.を使用して収集された場合にのみ100%正確ですESTIMATE_PERCENT => 100。AUTO_SAMPLE_SIZEアルゴリズムが11gでどのように機能するかについては、この投稿を参照してください。
  2. 結果は現在生成されたものでLAST_ANALYZEDあり、現在の結果は異なる場合があります。
于 2014-05-12T17:59:09.447 に答える
6

Oracle用の単純なSQLが必要な場合(たとえば、XmlGenのないXEがある場合)、単純な2ステップを実行します。

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

結果全体をコピーし、最後のUNIONをセミコロン(';')に置き換えます。次に、2番目のステップとして、結果のSQLを実行します。

于 2016-08-30T09:43:16.377 に答える
2

スキーマ内のすべてのテーブルの数を取得し、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;

結果全体をコピーして実行します

于 2019-07-18T02:51:45.900 に答える
1

即時実行(動的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; 
于 2012-05-22T15:38:21.680 に答える