0

以下のように、db リンクを介して 2 つのテーブルからデータをフェッチするクエリがあります。

SELECT a.ID, a.NAME, b.address
  FROM table1@dblink a, table2@dblink b
 WHERE a.ID = b.ID;

これは完全に正常に機能します。次に、以下のようにビューを作成します。

CREATE VIEW myview
AS
   SELECT a.ID, a.NAME, b.address
     FROM table1@dblink a, table2@dblink b
    WHERE a.ID = b.ID;

ビューが正常に作成されました。しかし、以下のようにビューからデータを選択すると:

SELECT *
  FROM myview

次のようなエラーが発生します。

ORA-00942: table or view does not exist
ORA-02063: preceding line from MYLINK

おそらく問題は何でしょうか?

編集:

さまざまな方法を試したところ、さまざまなエラーが発生しました。ここに正確なクエリと最新のエラーを投稿しています。

CREATE OR REPLACE VIEW plan_view
AS
   WITH plan_name AS
        (SELECT     fcr.argument1 AS plan_name, fcr.request_id AS request_id
               FROM apps.fnd_concurrent_requests@dblink fcr
              WHERE argument1 IN
                             ('E10', 'E20', 'E40', 'E60L', 'EDC', 'PS1', 'S')
         CONNECT BY PRIOR fcr.request_id = fcr.parent_request_id
         START WITH request_id =                                 -- '58043920'
                       (SELECT MAX (request_id) AS request_id
                          FROM apps.fnd_concurrent_requests@dblink
                         WHERE description = 'Mail Program'
                           AND actual_start_date >=
                                  TO_DATE (   TO_CHAR (TRUNC (SYSDATE - 1),
                                                       'mm-dd-yyyy'
                                                      )
                                           || '05:00:00 PM',
                                           'MM-DD-YYYY HH:MI:SS PM'
                                          )
                           AND actual_start_date < SYSDATE)),
        e10 AS
        (SELECT     TRIM
                       (BOTH ' ' FROM (SELECT meaning
                                         FROM apps.fnd_lookup_values@dblink
                                        WHERE lookup_type = 'CP_STATUS_CODE'
                                          AND lookup_code = fcr.status_code
                                          AND view_application_id = 0)
                       ) status,
                    TRIM
                       (BOTH ' ' FROM (SELECT meaning
                                         FROM apps.fnd_lookup_values@dblink
                                        WHERE lookup_type = 'CP_PHASE_CODE'
                                          AND lookup_code = fcr.phase_code
                                          AND view_application_id = 0)
                       ) phase,
                    fcr.request_id AS rid,
                    fcr.actual_start_date AS start_date,
                    fcr.actual_completion_date AS completion_date
               FROM apps.fnd_concurrent_requests@dblink fcr
         CONNECT BY PRIOR fcr.request_id = fcr.parent_request_id
         START WITH request_id = (SELECT request_id
                                    FROM plan_name
                                   WHERE plan_name IN ('E10')))
   SELECT 'E10' "PLAN_NAME", (SELECT MIN (start_date)
                                FROM e10) "START_DATE",
          (SELECT COUNT (rid)
             FROM e10)
     FROM DUAL

クエリから直接選択しようとすると、適切な出力が得られます。しかし、ビューを作成して試した後select * from plan_view、次のエラーが発生します。

ORA-00604: error occurred at recursive SQL level 1
ORA-00904: "FCR"."REQUEST_ID": invalid identifier
4

1 に答える 1

1

これは、特権の付与に関する古い問題のように思えます。アドホック DML (select、insert など) の場合、ロールを通じて付与された権限を使用できます。しかし、永続的なオブジェクト (ビュー、ストアド プロシージャなど) を構築するには、ユーザーに直接権限を付与する必要があります。

したがって、あなたが説明する現象の最も一般的な説明は、テーブルの所有者がそれらのテーブルに対する権限をあなたではなくロールに付与したということです。

于 2013-07-23T08:28:38.593 に答える