2

別のアプリケーションから呼び出す予定のストアド プロシージャを含むパッケージを作成しました。ストアド プロシージャは、スキーマ内のすべてのビューとテーブルの並べ替えられたリストを返します。これを行うには、次に示すように、DBA_TABLES および DBA_VIEWS シノニムに対して単純な選択を実行します。

CREATE OR REPLACE
PACKAGE BODY TITAN_ENTITY AS

  PROCEDURE GETSCHEMAOBJECTS (RESULTS IN OUT T_CURSOR)
  IS
    V_CURSOR T_CURSOR;
  BEGIN
    OPEN V_CURSOR FOR
       SELECT 'T' OBJECTTYPE, TABLE_NAME OBJECTNAME 
          FROM DBA_TABLES 
          WHERE OWNER = 'SONAR5'
       UNION ALL
       SELECT 'V' OBJECTTYPE, VIEW_NAME OBJECTNAME 
         FROM DBA_VIEWS 
         WHERE OWNER = 'SONAR5'
       ORDER BY OBJECTNAME;
    RESULTS := V_CURSOR;      

  END GETSCHEMAOBJECTS;

END TITAN_ENTITY;

問題のシノニムが存在し、公開されていることを確認しました。

CREATE PUBLIC SYNONYM "DBA_TABLES" FOR "SYS"."DBA_TABLES"
CREATE PUBLIC SYNONYM "DBA_VIEWS" FOR "SYS"."DBA_VIEWS"

私の理解では、それらは公開されているため、それらにアクセスするための追加の権限は必要ありません。その理解が間違っている場合は、誰かが私の概念を誤解させ、より正確なデータを指摘してくれることを願っています.

ここで私の問題があります。Oracle SQL Developer でワークシートを開き、これらのテーブルから問題なく選択できます。意味のあるデータをうまく取得できます(実際には567行)。しかし、ストアド プロシージャを実行しようとすると、以下に示すように、Oracle はコンパイル エラーを返します。

Error(9,8): PL/SQL: SQL Statement ignored
Error(10,16): PL/SQL: ORA-00942: table or view does not exist

2 番目のエラー メッセージをダブルクリックすると、SQL Developer によって最初の FROM 句 ("FROM DBA_TABLES") に移動します。

だから私はかなり困惑しています。SQL Server はよく知っていますが、Oracle は初めてなので、ご容赦ください。手がかりを提供していただけるか、正しい方向に向けていただければ幸いです。

前もって感謝します!

4

3 に答える 3

7

DBA_TABLESとDBA_VIEWSの代わりにALL_TABLESとALL_VIEWSを使用してください。ALL_%ビューは、すべてのユーザーがアクセスできる必要があります。

于 2008-12-18T23:36:17.567 に答える
4

ストアドPL/SQLプロシージャまたはストアドPL/SQL関数のテーブルまたはビューから選択する場合は、直接許可が必要です。データベースの役割を介した付与だけでは不十分です。

おそらく、ビューdba_tablesに直接付与する必要があります。(公開)同義語は単なる(公開)同義語です。選択権を直接付与する必要があります。

ここを参照してください: http://asktom.oracle.com/pls/asktom/f?p = 100:11:0 :::: P11_QUESTION_ID: 48704116042682#48798240264807

于 2008-12-18T23:36:50.763 に答える