powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Бага? recursive query + ANSI LEFT JOIN = inconsistent datatype
1 сообщений из 1, страница 1 из 1
Бага? recursive query + ANSI LEFT JOIN = inconsistent datatype
    #39298569
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть рекурсивный запрос - просто в SQL виде выполняется на "ура":

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
WITH tab( ID, up, val) AS(
  SELECT 1, NULL, 'A' FROM dual UNION ALL
  SELECT 2, 1, 'B' FROM dual UNION ALL
  SELECT 3, 2, 'C' FROM dual 
)
, tree (ID,up,val,lvl) AS(
  SELECT tab.id, tab.up, tab.val, 1 
  FROM tab WHERE tab.up IS NULL
  UNION ALL
  SELECT tab.id, tab.up, tab.val, tree.lvl + 1 
  FROM  tab 
  JOIN  tree ON tab.up = tree.id
)
SELECT tree.*, tab.val  FROM tree
LEFT JOIN  tab  ON tab.id = tree.id



Стоит для этого же запроса попытаться открыть курсор, получаю:
PL/SQL: ORA-00932: inconsistent datatype: expected NUMBER, got -
(анонимный блок / пакет с таким курсором даже не компилируется! т.е. это выходит не рантайм бага, а compile time)

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DECLARE
  l_id  NUMBER;
  rc SYS_REFCURSOR;
BEGIN
  OPEN rc FOR
    WITH tab( ID, up, val) AS(
      SELECT 1, NULL, 'A' FROM dual UNION ALL
      SELECT 2, 1, 'B' FROM dual UNION ALL
      SELECT 3, 2, 'C' FROM dual 
    )
    , tree (ID,up,val,lvl) AS(
      SELECT tab.id, tab.up, tab.val, 1 
      FROM tab WHERE tab.up IS NULL
      UNION ALL
      SELECT tab.id, tab.up, tab.val, tree.lvl + 1 
      FROM  tab 
      JOIN  tree ON tab.up = tree.id
    )
    SELECT tree.*, tab.val  FROM tree
    LEFT JOIN  tab  ON tab.id = tree.id;
END;



Если ANSI джоин заменить на оракловый внешний - вроде компилится
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
DECLARE
  l_id  NUMBER;
  rc SYS_REFCURSOR;
BEGIN
  OPEN rc FOR
    WITH tab( ID, up, val) AS(
      SELECT 1, NULL, 'A' FROM dual UNION ALL
      SELECT 2, 1, 'B' FROM dual UNION ALL
      SELECT 3, 2, 'C' FROM dual 
    )
    , tree (ID,up,val,lvl) AS(
      SELECT tab.id, tab.up, tab.val, 1 
      FROM tab WHERE tab.up IS NULL
      UNION ALL
      SELECT tab.id, tab.up, tab.val, tree.lvl + 1 
      FROM  tab 
      JOIN  tree ON tab.up = tree.id
    )
    SELECT tree.*, tab.val  
    FROM tree , tab
    WHERE  tab.id(+) = tree.id;
END;



Если использовать не внешнее ANSI соединение, тоже прокатывает ....
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
DECLARE
  l_id  NUMBER;
  rc SYS_REFCURSOR;
BEGIN
  OPEN rc FOR
    WITH tab( ID, up, val) AS(
      SELECT 1, NULL, 'A' FROM dual UNION ALL
      SELECT 2, 1, 'B' FROM dual UNION ALL
      SELECT 3, 2, 'C' FROM dual 
    )
    , tree (ID,up,val,lvl) AS(
      SELECT tab.id, tab.up, tab.val, 1 
      FROM tab WHERE tab.up IS NULL
      UNION ALL
      SELECT tab.id, tab.up, tab.val, tree.lvl + 1 
      FROM  tab 
      JOIN  tree ON tab.up = tree.id
    )
    SELECT tree.* FROM tree 
    JOIN tab ON tab.id = tree.id;
END;



Кто виноват и что делать? :) ANSI синтаксис - днище ?


P.S:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production

--------------------------------------------------------------
Запомните, товарищи офицеры, чтобы ничего не делать, надо уметь делать все.
...
Рейтинг: 0 / 0
1 сообщений из 1, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Бага? recursive query + ANSI LEFT JOIN = inconsistent datatype
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]