Использование выражения CURSOR в предложении WITH в запросе Oracle 12.1 - PullRequest
1 голос
/ 14 апреля 2020

У меня странная проблема, когда данные, отображаемые в курсоре, неверны . Ниже таблица и запрос. Но когда я заменяю CURSOR (Select * from H) на CURSOR (фактический запрос H), он работает

   Tab1              Tab2
Col1  Col2        Col3  Col4
----------        ----------
1     A            1     A
2     B            2     B
3     C            6     F
4     D            7     G
5     E            8     H

WITH  H AS (SELECT * FROM tab1
              WHERE NOT EXISTS (SELECT 1 FROM tab2 WHERE col1 = col3)
             )
       K AS (SELECT count(*) cnt FROM H) 
 SELECT cnt, CURSOR(SELECT * FROM H) result FROM K;

Вывод вышеупомянутого запроса дает Cnt = 3, и курсор имеет данные, как показано ниже, что неверно. Но когда вы просто запускаете Select * from H, вы получаете правильный вывод, то есть 3, 4, 5 строк

Col1  col2
---   ---
 1     A
 2     B

1 Ответ

2 голосов
/ 14 апреля 2020

Согласно этой статье Рефакторинг подзапроса использует глобальную временную таблицу или встроенное представление.

В вашем случае это может быть глобальная временная таблица, и я предполагаю, что ключевое слово CURSOR делает что-то неявное с глобальной временной таблицей.

Попробуйте использовать подсказку INLINE и посмотрите, работает ли она

WITH  H AS (SELECT  /*+ INLINE */ a.* FROM tab1 a
          WHERE NOT EXISTS (SELECT 1 FROM tab2 WHERE col1 = col3)
         )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...