ORA-00928 выбирает из вида по ссылке на БД, но работает локально
У меня есть представление с запросом следующей формы, которая прекрасно работает, когда я запрашиваю его на локальном сервере из любой схемы:
WITH dates AS (
SELECT /*+ materialize */ ... FROM ( SELECT ... FROM table@link)
UNION ALL
SELECT * FROM ( SELECT /*+ materialize */ FROM table@link )
)
SELECT ... FROM (
SELECT ... FROM (
SELECT ... FROM (
SELECT ... FROM (
SELECT ... FROM
)
) foo
LEFT OUTER JOIN (
SELECT /*+ USE_MERGE(hle dates) */ ... FROM
) bar ON conditions
)
)
UNION ALL
SELECT ... FROM (
SELECT ... FROM (
SELECT ... FROM (
SELECT ... FROM (
SELECT ... FROM
)
) foo
LEFT OUTER JOIN (
SELECT /*+ USE_MERGE(hle dates) */ ... FROM
) bar ON conditions
)
)
Когда я запускаю запрос с любой удаленной ссылки БД на любом другом сервере, например SELECT * from someschema.my_view@db_link
, Я получил:
ORA-00928: missing SELECT keyword
ORA-02063: preceding line from PLLDB
00928. 00000 - "missing SELECT keyword"
*Cause:
*Action:
Error at Line: 2 Column: 9
Oracle считает, что строка 2 - это проблема. Вот первые пять фактических строк:
WITH dates AS (
-- Get days
SELECT /*+ materialize */
row_number() OVER (ORDER BY begin_period DESC) rn,
'D' AS interval_type,
Все другие представления отлично работают по ссылке на БД (однажды отредактированная, чтобы обойти любые связанные ошибки Oracle).
Почему этот вид работает идеально локально, а не через ссылку на БД?
1 ответ
Ссылаясь отсюда
BUG 768478
Сообщение "ORA-00928: missing SELECT keyword
"может произойти, когда Oracle на основе затрат пытается переписать запрос, который содержит оператор набора (например, UNION, MINUS
, или же INTERSECT
) с материализованным взглядом.
Есть три обходных пути:
1. Отключить переписывание запроса с помощьюALTER {SESSION|SYSTEM} DISABLE QUERY REWRITE
" заявление.
2. Используйте NOREWRITE
намек на все SELECT
операторы, на которые ссылается оператор множества.
3. Используйте REWRITE(mv)
намек на все SELECT
операторы в операторе набора, чтобы сказать оптимизатору явно использовать материализованное представление.
Scalar expressions
ссылка на элементы факторинга SQL (WITH
... AS
) не полностью поддерживаются в подзапросах представления. Доступ к нему локально работает нормально, но удаленный доступ через dblinks
ошибки каждый раз.