Search notes:

ORA-32044: cycle detected while executing recursive WITH query

Creating two tables and fill them with some test data.
create table tq84_elem (
   id   char  (1) not null primary key,
   data number(2) not null
);

create table tq84_link (
   prev_elem  not null references tq84_elem,
   next_elem  not null references tq84_elem,
   primary key (prev_elem, next_elem)
);

begin

   insert into tq84_elem values('A',  7 );
   insert into tq84_elem values('B',  2 );
   insert into tq84_elem values('C', 13 );
   insert into tq84_elem values('D',  6 );
   insert into tq84_elem values('E',  9 );

   insert into tq84_link values('B', 'D');
   insert into tq84_link values('B', 'A');
   insert into tq84_link values('A', 'C');
   insert into tq84_link values('C', 'D');

   commit;
end;
/
Recursively querying the data:
with rec(prev_elem, next_elem, prev_data, next_data, lvl) as (
   select
      lnk.prev_elem,
      lnk.next_elem,
      elp.data,
      eln.data,
      0
   from
      tq84_link lnk                             join
      tq84_elem elp on lnk.prev_elem = elp.id   join
      tq84_elem eln on lnk.next_elem = eln.id
   where
      prev_elem = 'B'
union all
   select
      lnk.prev_elem,
      lnk.next_elem,
      rec.next_data,
      eln.data,
      lvl + 1
   from
      rec                                             join
      tq84_link lnk on rec.next_elem = lnk.prev_elem  join
      tq84_elem eln on lnk.next_elem = eln.id
)
search depth first by prev_elem set ord
select
   rpad(' ', lvl * 5) ||
        prev_elem || ' (' || to_char(prev_data, 'fm99') || ') -> ' ||
        next_elem || ' (' || to_char(next_data, 'fm99') || ')' x
from
   rec
order by
   ord;
The insert data essentially represents a directed graph with the values in tq84_elem being the nodes and the values in tq84_link the edges. The previous query's result is:
B (2) -> A (7)
     A (7) -> C (13)
          C (13) -> D (6)
B (2) -> D (6)
The current data does not have cycles in the directed graph, it thus is an directed acyclic graph.
Adding the following record creates a cycle in the graph (D -> A -> C -> D).
begin
   insert into tq84_link values ('D', 'A');
   commit;
end;
/
Because the data is now cyclic, the above recursive query causes the error ORA-32044: cycle detected while executing recursive WITH query with the previous query.
Using the cycle clause prevents the error:
with rec(prev_elem, next_elem, prev_data, next_data, lvl) as (
   select
      lnk.prev_elem,
      lnk.next_elem,
      elp.data,
      eln.data,
      0
   from
      tq84_link lnk                             join
      tq84_elem elp on lnk.prev_elem = elp.id   join
      tq84_elem eln on lnk.next_elem = eln.id
   where
      prev_elem = 'B'
union all
   select
      lnk.prev_elem,
      lnk.next_elem,
      rec.next_data,
      eln.data,
      lvl + 1
   from
      rec                                             join
      tq84_link lnk on rec.next_elem = lnk.prev_elem  join
      tq84_elem eln on lnk.next_elem = eln.id
)
search depth first by prev_elem set ord
cycle prev_elem set cyl to 1 default 0                              -- <<=== Use cycle clause to prevent error
select
   rpad(' ', lvl * 5) ||
        prev_elem || ' (' || to_char(prev_data, 'fm99') || ') -> ' ||
        next_elem || ' (' || to_char(next_data, 'fm99') || ')' x
from
   rec
order by
   ord;
Preventing the error comes with the cost that the result set is now blown up because some links (such as D -> A) are reported multiple times, the result set is:
B (2) -> A (7)
     A (7) -> C (13)
          C (13) -> D (6)
               D (6) -> A (7)
                    A (7) -> C (13)
B (2) -> D (6)
     D (6) -> A (7)
          A (7) -> C (13)
               C (13) -> D (6)
                    D (6) -> A (7)
Cleaning up:
drop table tq84_link;
drop table tq84_elem;

See also

Hierachical queries with Common Table Expressions (CTEs).
The with clause.
Other Oracle error messages

Index

Fatal error: Uncaught PDOException: SQLSTATE[HY000]: General error: 8 attempt to write a readonly database in /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php:78 Stack trace: #0 /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php(78): PDOStatement->execute(Array) #1 /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php(30): insert_webrequest_('/notes/developm...', 1758206646, '216.73.216.150', 'Mozilla/5.0 App...', NULL) #2 /home/httpd/vhosts/renenyffenegger.ch/httpsdocs/notes/development/databases/Oracle/errors/ORA-32044_cycle-detected-whlie-executing-recursive-WITH-query(183): insert_webrequest() #3 {main} thrown in /home/httpd/vhosts/renenyffenegger.ch/php/web-request-database.php on line 78