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 ошибки каждый раз.

Другие вопросы по тегам