0

私はOracle 10gデータベースにストアドプロシージャを作成しようとしました。これは、データを選択dba_segmentsして別のテーブルに挿入します(つまり、table_space)。

作成または置換
手順 P_DAILY_ENTRY
は
  an_job_id 番号;
始める
    INSERT INTO table_space(table_name, max_size, date_of_max_size)
        テーブル名を選択し、
          TRUNC(SUM(バイト)/1024) max_size,
          sysdate date_of_max_size
        から
          (
          SELECT セグメント名 テーブル名、所有者、バイト
          FROM dba_segments
          WHERE セグメント タイプ = 'テーブル'
          ユニオンオール
          SELECT セグメント名 テーブル名、所有者、バイト
          FROM dba_segments
          WHERE セグメント タイプ = 'INDEX'
          )
        WHERE 所有者 ('CARAT')
        GROUP BY table_name、所有者
        ORDER BY SUM(bytes) DESC;
    その他の場合の例外
        ロールバック;
END P_DAILY_ENTRY;

上記を実行すると、次の2つのエラーが表示されます。

  • ライン05 | 実行 | PL/SQL: SQL文は無視されました
  • 12行目 | 実行 | PL/SQL: ORA00942: テーブルまたはビューが存在しません

ただし、INSERTステートメントを個別に実行すると、table_spaceテーブルにデータが入力されます。

4

1 に答える 1

1

これはおそらく権限の問題INSERTです。実行できるコマンドは、必ずしもプロシージャの所有者が実行できるコマンドであるとは限らないためです (これは、Oracle 内の Invoker/Definer 権限アーキテクチャに関係しています)。

ORA-00942多くの問題をカバーできます。一般的な問題は、「見る」ことができない場合、テーブルが存在しないと見なされることです(これは理にかなっています:多くのオラクルエラーメッセージは、人々がデータベースのセットアップについてもっと知るのを止めるように設計されています意図的に簡潔にしています)。

于 2013-11-06T14:20:05.167 に答える