Oracle
 sql >> Base de données >  >> RDS >> Oracle

Obtention d'une erreur en tant que ORA-32044 :cycle détecté lors de l'exécution d'une requête récursive AVEC

Votre code fonctionnera correctement, sauf pour une seule condition de données, à savoir lorsque votre to_customer (1000022560394) lui-même a commencé la transaction en premier lieu et qu'après un certain niveau de transaction, il lui est renvoyé uniquement.

Par exemple-Exemple de jeu de données

Dans ce cas, votre partie récursive de la requête trouvera toutes ses conditions vraies même à la fin de la transaction, car les données seront là à la fois dans votre table normale et dans votre jeu de données incrémentiel.

Une solution consiste à créer un match-flag pour déterminer son nombre de rencontres et éviter une boucle infinie :

WITH EmpsCTE (affiliation_id, from_customer_id,to_customer_id, to_name,level1,match_count)  
AS  
(  
SELECT affiliation_id, from_customer_id,to_customer_id, to_name, 0, 0 match_count  
 FROM affiliation aff  
 WHERE to_customer_id != from_customer_id  
 and to_customer_id = 1000022560394  
UNION ALL  
SELECT aff.affiliation_id, aff.from_customer_id,aff.to_customer_id, aff.to_name, m.level1 + 1,1 match_count  
 FROM affiliation aff  
 INNER JOIN EmpsCTE  m  
 ON aff.to_customer_id = m.from_customer_id  
 where m.match_count=0  
)  
SELECT * FROM EmpsCTE;