Forum
Hallo Zusammen,
Nachfolgend ein Code-Abschnitt mit einigen Erklärungen zu rekurs. SQL; er ist so unter UDB LUW gelaufen, sollte aber auch auf z/OS funktionieren.
MfG
Hansi Böcking
— Die untenstehende Abfrage ermittelt rekursiv aus SYSRELS alle RIs der Tabelle "MEER"
— und gibt Name/Creator der beteiligten Parent-(REF) und Dependent-Tables aus.
—
— Eine solche Abfrage ist unter mehreren Aspekten problematisch:
— – Katalogtabellen sind immer kritisch bzgl. ihres Umfangs, daher
— sollte der Join eingegrenzt sein: z.B. gleiche Tabellen UND gleiche Creator
— – Da eine Tabelle eine Referenz auf sich selber haben kann, sind Zyklen möglich
— –> es wird eine Abbruchbedingung für die Rekursion benötigt:
— am einfachsten kann man/frau dies durch einen eigenen Zaehler erreichen;
— im Beispiel leistet das die Expression LEVEL
— – Der erste SELECT beschreibt quasi die Ausgangs-Menge (Parent mit Start-Bedingung),
— auf die sich der rekursive SELECT, der immer nach UNION ALL stehen muss, bezieht.
— – Der rekursive SELECT legt fest (so die Idee), wie die Childs ermittelt werden sollen.
— Die auzugebenden Spalten stammen im Regelfall aus der gejointen Basis-Tabelle
— – Schließlich werden die Daten durch den letzten SELECT ausgegeben; oftmals ist
— hier ein SELECT DISTINCT … empfehlenswert, da innerhalb von Zyklen jede
— Child-Ebene alle Daten der vorherigen Child-Ebenen enthält.
— – Wird keine Start-Bedingung formuliert, liefert u.U. bereits die Parent-Menge alle
— Ergebnis-Zeilen –> in Rekursion reicht WHERE LEVEL < 1 als Abbruch-Bedingung aus.
— Zur Verdeutlichung habe ich die Spalte KLASSE eingefügt,
— connect to xxx;
WITH STRUCTURE
(PCREATOR, PNAME, CCREATOR, CNAME, LEVEL, KLASSE)
AS (
SELECT SUBSTR(S.REFTBCREATOR, 1, 20),
SUBSTR(S.REFTBNAME, 1, 20),
SUBSTR(S.CREATOR, 1, 20),
SUBSTR(S.TBNAME, 1, 20),
1,
‚Parent‘
FROM SYSIBM.SYSRELS S
WHERE S.REFTBCREATOR = ’name‘
AND REFTBNAME = ‚MEER‘
UNION ALL
SELECT SUBSTR(B.REFTBCREATOR, 1, 20),
SUBSTR(B.REFTBNAME, 1, 20),
SUBSTR(B.CREATOR, 1, 20),
SUBSTR(B.TBNAME, 1, 20),
LEVEL + 1,
‚Child‘
FROM STRUCTURE S,
SYSIBM.SYSRELS B
WHERE S.CNAME = B.REFTBNAME
AND S.CCREATOR = B.REFTBCREATOR
AND LEVEL < 4
)
SELECT DISTINCT PCREATOR, PNAME, CCREATOR, CNAME, KLASSE
FROM STRUCTURE
;