Recursives SQL und Z-OS DB2 8.1
- Dieses Thema hat 4 Antworten und 1 Teilnehmer, und wurde zuletzt aktualisiert vor 17 Jahre, 10 Monaten von
Anonym.
-
AuthorPosts
-
8. November 2005 um 14:27 Uhr #2627
AnonymInaktivHallo zusammen
ich krieg ein SQL nicht zum laufen – d.h. der SQL loopt warscheinlich::
WITH STRUCTURE
(PCREATOR, PNAME, CCREATOR, CNAME)
AS (
SELECT
S.REFTBCREATOR,
S.REFTBNAME,
S.CREATOR,
S.TBNAME
FROM SYSIBM.SYSRELS S
WHERE S.REFTBCREATOR = ‚myname‘UNION ALL
SELECT
B.REFTBCREATOR,
B.REFTBNAME,
B.CREATOR,
B.TBNAME
FROM STRUCTURE S,
SYSIBM.SYSRELS B
WHERE S.CCREATOR = B.REFTBCREATOR
)
SELECT * FROM STRUCTURE——-
Wenn ich den SQL Abschicke so passiert gar nichts -vielleicht weiß jemand was ich falsch mache
Vieleln Dank
Zefrim
9. November 2005 um 15:33 Uhr #3052
AnonymGastHi Zefim,
ohne das ich es untersucht habe – gibts da irgendwo in den referenzierten Tabellen eine self-referencing RI?
Loopts vielleicht deshalb?MfG Rolf
10. November 2005 um 6:33 Uhr #3352
AnonymInaktivWas passiert eigentlich, wenn  CREATOR und REFTBCREATOR identisch sind ( beides ‚myname‘ ).
Die Zeile würde dann doch immer wieder neu dazugefügt ?Ersetze doch mal testweise das UNION ALL durch ein UNION.
10. November 2005 um 8:30 Uhr #3539
AnonymInaktivmoin, moin,
sorry meine SQL-Kenntnisse beruhen auf Oracle, von daher ist mir der with structure bis eben gerade noch nicht über den Weg gelaufen. Im 8. Buch Denne finde ich auch keinen Psalm, der passt.
Also einfach mal ausprobiert. Und es kommt nicht zurück.Mit UNION statt UNION ALL läuft man auf einen
SQLCODE = -342, ERROR: THE COMMON TABLE EXPRESSION STRUCTURE MUST NOT USE SELECT DISTINCT AND MUST USE UNION ALL
BECAUSE IT IS RECURSIVEFür mich sieht es so aus, dass dieses with structure so eine Art View darstellt, die sich dann aber selber
aufruft. Und das ohne erkennbares Abbruch-Kriterium.
Und dann muss es imho schief gehen bzw. endlos laufen.
Kay
14. November 2005 um 10:38 Uhr #3669
AnonymGastHallo 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
;
-
AuthorPosts
You must be logged in to reply to this topic.