0
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; 

これを使用して、スキーマ内のすべてのテーブルの行数を取得しています。このクエリは、stackoverflow から取得しました。

これを正常にコンパイルされた手順として実行しましたが、結果を表示できません y そうですか?

私はpl / sqlを初めて使用しますが、背後にあるロジックを理解できない即時クエリを実行した後、selectステートメントが何をするのか誰でも説明できます。

4

5 に答える 5

0

この手順は正常に実行されています

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) = 'coreown'  ;

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;
/

私は最後に試しました。

USEを実行した後COMMIT、変更を保存するようにDBです。その後、再度確認してください。

于 2013-04-26T13:56:28.687 に答える
0

user_tables には user 列がないため、そのクエリは無効です。クエリは常に単独でテストします。おそらくall_tablesorが必要dba_tablesです。DISTINCTまた、そのクエリが必要だと思いますか?

できる限り、明示カーソルの代わりに暗黙カーソルを使用してください。つまり、コードが少なくなり、コーディングでエラーが発生しにくくなり、高速になります。

日付を文字型として保存しないでくださいsysdate。文字列としての表現ではなく、単に挿入します。

変数名の前に「v_」を付けないでください。プロシージャまたはブロック名で名前空間を付けてください。

は、stats_tableExecute Immediateを実行する SQL ステートメントを構築します(名前に「テーブル」という単語が含まれているのはなぜですか? それは冗長ですよね?)insert into

クエリは次のように構成されます。

INSERT INTO STATS_TABLE
     (   TABLE_NAME
       , SCHEMA_NAME
       , RECORD_COUNT
       , CREATED
     ) 
SELECT 'MY_TABLE_NAME' , 'MY_USERNAME' , COUNT(*) , SYSDATE
FROM MY_TABLE_NAME;
于 2013-04-25T19:33:48.393 に答える
0

行数はテーブル名に挿入されますSTATS_TABLE。実行する必要があります

select *
from stats_table

手順を実行した後

于 2013-04-25T16:02:05.323 に答える