powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Рекурсивный WITH в PL/SQL
9 сообщений из 9, страница 1 из 1
Рекурсивный WITH в PL/SQL
    #39513696
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то не пойму, то-ли лыжи не едут, то-ли бага оракловая

Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
PL/SQL Release 11.2.0.4.0 - Production
CORE 11.2.0.4.0 Production
TNS for Linux: Version 11.2.0.4.0 - Production
NLSRTL Version 11.2.0.4.0 - Production



Есть запрос, простейший. Сочетает в себе конструкцию TABLE() и рекурсивный WITH

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
   TYPE  tt_number IS TABLE OF NUMBER;


   WITH w_start AS(
     SELECT * FROM TABLE(tt_number(1))
   )
   , w_tree(ID, up ) AS(
     SELECT COLUMN_VALUE ID, NULL up FROM w_start
     UNION ALL
     SELECT ch.id, ch.up
     FROM w_tree t
     JOIN (SELECT 2 ID, 1 up FROM dual ) ch ON(t.id = ch.up)
   )
   SELECT * FROM w_tree;  




Запрос сам по себе нормально выполняется.

Но стоит сделать из него курсор или как-то заюзать его в PL/SQL контексте - вываливает ORA-600
Compilation errors for PACKAGE BODY BRIS_TULA.PKG_COMIS

Error: PL/SQL: ORA-00600: код внутренней ошибки, аргументы: [qctcrcol:dty], [1], [2], [], [], [], [], [], [], [], [], []





Причем при компиляции пакета с таким курсором ORA-600 вообще уже в compile time получается!

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
DECLARE
  CURSOR c IS
   WITH w_start AS(
     SELECT * FROM TABLE(tt_number(1))
   )
   , w_tree(ID, up ) AS(
     SELECT COLUMN_VALUE ID, NULL up FROM w_start
     UNION ALL
     SELECT ch.id, ch.up
     FROM w_tree t
     JOIN (SELECT 2 ID, 1 up FROM dual ) ch ON(t.id = ch.up)
   )
   SELECT * FROM w_tree;  
  
BEGIN
  
   NULL;


END;




Если убрать конструкцию TABLE() из запроса (заменить на селект из какой-нить нормальной таблицы ) всё работает.
Фигня какая-то :(
...
Рейтинг: 0 / 0
Рекурсивный WITH в PL/SQL
    #39513701
ora601
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anvanoФигня какая-то :(

Все верно, ora-600 другими словами)
...
Рейтинг: 0 / 0
Рекурсивный WITH в PL/SQL
    #39513815
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anvano,

невезуха
12-ка
ORA-06550: line 13, column 18:
PL/SQL: ORA-00600: internal error code, arguments: [qctcrcol:dty], [1], [2], [], [], [], [], [], [], [], [], []
ORA-06550: line 3, column 1:
PL/SQL: SQL Statement ignored


1. declare
2. cursor c1 is
3. WITH w_start AS(

.....
stax
...
Рейтинг: 0 / 0
Рекурсивный WITH в PL/SQL
    #39513819
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anvano,


11-ка
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
SQL> declare
  2  cursor c1 is
  3     WITH w_start AS(
  4       SELECT value(t) cv FROM TABLE(tt_number(1)) t
  5     )
  6     , w_tree(ID, up ) AS(
  7       SELECT CV ID, NULL up FROM w_start
  8       UNION ALL
  9       SELECT ch.id, ch.up
 10       FROM w_tree t,(SELECT 2 ID, 1 up FROM dual ) ch
 11       where t.id = ch.up
 12     )
 13     SELECT * FROM w_tree;
 14  begin
 15   null;
 16  end;
 17  /

PL/SQL procedure successfully completed.

SQL>
...
Рейтинг: 0 / 0
Рекурсивный WITH в PL/SQL
    #39514082
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
anvano,
12.2 баг подтверждаю. ошибка та же.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
declare
  cursor c is
    with w_start as
     (select * from table(sys.odcinumberlist(1))),
    w_tree(id,
    up) as
     (select column_value id,
             null         up
        from w_start
      union all
      select ch.id,
             ch.up
        from w_tree t
        join (select 2 id,
                     1 up
                from dual) ch
          on (t.id = ch.up))
    select * from w_tree;
begin
  null;
end;
...
Рейтинг: 0 / 0
Рекурсивный WITH в PL/SQL
    #39514090
Код: plsql
1.
FROM dual


Дуал вообще очень глючная вещь, не только в with и plsql.
...
Рейтинг: 0 / 0
Рекурсивный WITH в PL/SQL
    #39514120
Vint
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фаст дантес,
сдышал звон....
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
declare
  cursor c is
    with w_start as
     (select * from table(sys.odcinumberlist(1))),
    w_tree(id,
    up) as
     (select column_value id,
             null         up
        from w_start
      union all
      select ch.id,
             ch.up
        from w_tree t
        join (select 2 id,
                     1 up
                from user_tables where rownum=1) ch
          on (t.id = ch.up))
    select * from w_tree;
begin
  null;
...
Рейтинг: 0 / 0
Рекурсивный WITH в PL/SQL
    #39514134
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Staxanvano,


11-ка
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
  8       UNION ALL
  9       SELECT ch.id, ch.up
 10       FROM w_tree t,(SELECT 2 ID, 1 up FROM dual ) ch
 11       where t.id = ch.up

PL/SQL procedure successfully completed.

SQL>



Да, замена ANSI джоина на классический внутри рекурсивного WITH помогла :)
Спасибо.
...
Рейтинг: 0 / 0
Рекурсивный WITH в PL/SQL
    #39514136
anvano
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фаст дантесДуал вообще очень глючная вещь, не только в with и plsql.

DUAL только для создания минимально воспроизводимого примера использовался.

В реальности естественно там обычная таблица с иерархическими данными.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / Рекурсивный WITH в PL/SQL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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