Использование DB Links на скрипте PL / SQL приводит к ошибке «Таблица не найдена» - PullRequest
2 голосов
/ 02 августа 2011

При попытке создать отчет с использованием PL / SQL я обнаружил, что застрял со следующей проблемой, я создал запрос SQL, который обращается к 2 таблицам на удаленной БД с помощью ссылки на БД, сам по себе выполнение запроса возвращает ожидаемый результат. результаты, но когда я запускаю тот же запрос и помещаю результаты в курсор, я получаю

PL/SQL: ORA-00942: table or view does not exist

ошибка.

Я не уверен, имеет ли это какое-то отношение к псевдониму, который я использую для каждой таблицы, или, возможно, оператор select пытается выбрать локальные таблицы, я не знаю, у вас есть какие-либо предложения?

PL / SQL:

DECLARE
   CURSOR t_bug_details IS (SELECT h.*
  FROM table1@REMOTEDB h,
       table2@REMOTEDB rml
  WHERE h.product_id   IN (123)
  AND h.category       IN ('category')
  AND h.status          < 4
  AND h.status NOT     IN (1,2,3)
  AND h.release_status IN (upper('P'))
  --AND h.programmer     IN (upper('MRFOO'))
  AND h.some_id      = rml.some_id
  and rownum <=400);

REPORT_DAY VARCHAR2(40);
mail_html clob;
mail_bod clob;

BEGIN

FOR v_some_details in t_bug_details
LOOP
REPORT_DAY := TO_CHAR(SYSDATE,'DD-MON-YYYY HH24:MI:SS');
DBMS_OUTPUT.PUT_LINE(REPORT_DAY || '|' ||
                     v_some_details.reptnom || '|' ||
                     v_some_details.subject || '|' ||
                     v_some_details.field || '|' ||
                     v_some_details.release_status || '|' ||
                     v_some_details.status || '|' ||
                     v_some_details.category || '|' ||
                     v_some_details.sub_field || '|' ||
                     v_some_details.datef1 || '|' ||
                     v_some_details.field_by || '|' ||
                     v_some_details.programmer || '|' ||
                     TRUNC(sysdate - v_some_details.datef1) || '|' ||
                     TRUNC(sysdate - v_some_details.upd_date)|| '|' ||
                     v_some_details.fix_avail_date|| '|' ||
                     v_some_details.bug_type || '|' ||
                     v_some_details.base_reptnom);
END LOOP;

EXCEPTION WHEN NO_DATA_FOUND
THEN
DBMS_OUTPUT.PUT_LINE ('NO RECORDS FOUND');
END;

Ответы [ 2 ]

5 голосов
/ 02 августа 2011

PL / SQL может работать с другими правами, чем SQL.Я предполагаю, что у вас есть права на эти таблицы, предоставленные через роль, которую может использовать ваш пользователь, но PL / SQL не может по умолчанию.Это разница между правами определителя и правами вызывающего.См. документацию Oracle для получения дополнительной информации.

0 голосов
/ 10 июня 2012

Я сталкиваюсь с той же ошибкой с 10g.

  1. Это произошло, когда я сделал ссылку на частную БД и получил ошибку ora-00942.

  2. Пользователь ссылки не является владельцем таблиц, но ему предоставляется доступ к таблицам

  3. Итак, я изменил ссылку на публичную ссылку - тогда все работало нормально.

...