Probleme bei einer Procedure

Gigoloart.inc

Neuer Benutzer
Beiträge
4
Hallo Leute. Ich habe eine Frage und kenne mich mit SQL nicht gut aus.

Hier ist erstmal das Problem, dass ich zu lösen versuche:

ich habe eine Tabelle1 mit n Elementen. Hier fange ich mit meiner Abfrage an. Für jedes Element aus dieser Tabelle mache ich folgendes: (Einfache For Schleife) 1. Finde in der Tabelle2 das Element, dass über einen Schlüssel mit dem Element aus tabelle1 zusammenhängt. Speicherung in einem Array (Einfache Select Abfrage). 2. Finde in Tabelle3 das Element, dass über einen schlüssel mit dem unter 1. gefundenen Element zusammenhängt. Speicherung in einem Array(Wieder einfache Select Abfrage) 3. Finde in Tabelle3 die ElementE (es können n sein) die über koordinaten mit dem unter 2 gefundenen Element zusammenhängt. N-Elemente in einem Array speichern. Fange mit dem ersten davon an. (wieder Loop) 4-n. Jetzt wiederholt sich Nr. 3 bis kein Element mehr existiert, dass über die Koordinaten mit dem letzten element verbunden ist. Abfrage, ob letztes Element zu einer bestimmten Klasse gehört.

-- meine Fragen: 1. wie du siehst können sich hier Baumstrukturen entwickeln, die sehr lang werden können. Wie kann ich geschickt ein programm schreiben, so dass ich nicht für jede der 4-n Schritte ein neues Array erstellen, darin speichern und wieder einen Loop starten muss?? 2. Da die "wurzeln" miteinander verbunden sein können möchte ich verhindern, dass schonmal abgefahrene Elemente nicht nochmal verwendet werden. Wie kann ich das Machen? Evtl eine Prüfung der Tabelle3 mit einer tabelle4(geprüfte elemente) oder dem löschen der daten aus der Tabelle?


und hier ist der bisherige Code:

for rec in (
select (ID)
from v_KVS)
loop


select (id, father_id, nispg_anlagen_id, x1, y1, x2, y2)
From v_Nispg_sicherung
where v_KVS.id = v_nispg_sicherung.nispg_anlagen_id
and Father_ID is not NULL;

--wie speicher ich das Ergebnis in ein array?

for rec in (
select spalte id, father_id, nispg_anlagen_id, x1, y1, x2, y2
from array1)
loop


select (id, table_id, father_id, x1, y1, x2, y2)
from v_View_Netzobjekte
where v_nispg_sicherung.Fahter_ID = v_view_netzobjekte.ID
AND (
(v_Nispg_sicherung.x1 = v_view_netzobjekte.x1
AND v_Nispg_sicherung.y1 = v_view_netzobjekte.y1)
OR
(v_Nispg_sicherung.x2 = v_view_netzobjekte.x2
AND v_Nispg_sicherung.y2 = v_view_netzobjekte.y2)
)

--Hier versuche ich die Koordinaten zu finden, die das Ende des Elements beschreiben.

-- Save this into Array2


Select (id, table_id, father_id, x1, y1, x2, y2)
From v_view_netzobjekte
where array2.x1 = v_view_netzobjekte.x1
and arrey2.y1 = v_viw_netzobjekte.y1 --respectivly the other coordinates

for rec in (
select (id, table_id, father_id, x1, y1, x2, y2)
From Array2)
loop

Select (id, table_id, father_id, x1, y1, x2, y2)
From v_view_netzobjekte
where array2.x1 = v_view_netzobjekte.x1
and arrey2.y1 = v_viw_netzobjekte.y1

-- dieser Loop müsste jetzt solange wiederholtwerden (und jede Schleife kann wieder bis zu n Elemente ausgeben) bis es keine Elemente gibt, die mit den Koordinaten verknüft sind. Da müsste ich aber immer wieder den Loop neu schreiben, da ich nicht weiß wie tief der Baum geht. Gibt es da eine bessere Lösung?
-- Außerdem will ich die bereits durchlafenden Elemente (aus einer Schleife) nicht später nochmal duchlaufen 8theoretisch ist das hier möglich, da die Elemente miteinander verbunden sein können.


Vielen Dank
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.736
-- meine Fragen: 1. wie du siehst können sich hier Baumstrukturen entwickeln, die sehr lang werden können. Wie kann ich geschickt ein programm schreiben, so dass ich nicht für jede der 4-n Schritte ein neues Array erstellen, darin speichern und wieder einen Loop starten muss??


Klingt in Summe nach rekursiven Abfragen, was IIRC auch Oraggle kann.

Könntest Du mal Deine Tabellen und einige wenige Demo-Datensätze zeigen und auch, was bei rauskommen soll?
 

Gigoloart.inc

Neuer Benutzer
Beiträge
4
Genau. Wie kann ich jetzt so eine rekursion in Oracle umsetzen?

Tabellen und Datensätze habe ich nur in der theorie.

tabelle_kvs
ID (PK )

tabelle_nispg_sicherung
ID (PK)
Father_ID (FK) --Bezug zu Tabelle_kvs
NiSpg_Anlagen_ID
x1
y1
x2
y2

Tablle_netzobjekte
ID (PK)
Father_ID
Table_ID
x1
y1
x2
y2

für jedes Element auf tabelle_kvs soll:

1. das element in tabelle_nispg_sicherung gefunden werden wo kvs.ID = nispg_sicherung.nispg_anlagen_id

2. für das gefundene element aus nispg_sicherung soll in tabelle_netzobjekte das element gefunden werden wp nispg_sicherung.Father_ID = netzobjekte.ID

3. Hier beginnt der Rekursionsteil:
3.1 Finde für das gefunde Element aus tabelle_netzobjekte alle elemente aus tabelle_netzobjekte wo x2y2(des zuvor gefundenen Elements) = netzobjekte.x1y1
Die ergebnisse sollen gespeichert werden und dann soll mit dem ersten Objekt aus dieser Ergebnisliste wieder mit 3.1 gestartet werden.
4. Das soll so lange gehen, bis es kein Element mehr gibt.
 

Gigoloart.inc

Neuer Benutzer
Beiträge
4
So ich hab das jetzt mal etwas verständlicher versucht zu erklären:

Table start
Table objects
Table Children
Table found_objects;
Table queue;
Table failure;

For each row in table start do:
Insert the row into table queue

while (queue IS Not empty) -- AS Long as there are rows in queue
{
Select the first row out of queue and delete it from queue
Insert row into found_objects
Select those rows from objects where condition is fulfilled and save them into children;
If children IS empty AND row is not of class a,b or c then
Insert row into failure
Else
foreach row of of children
if row is not in queue or found_objects then
insert row into queue and delete it from children
Else delete it from children
}
kann mir da jemand helfen einen code zu erstellen?
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.736
Und kannst Du mir beim Code helfen? Wenn ich es könnte, würde ich es ja selbst machen :)

Ich kenn mich mit Oraggle nicht aus, außerdem hab ich noch nicht verstanden was Du im Detail willst und drittens ist Crossposting ohne Info nicht nett gegenüber den anderen hier. Aber beachte auch die Antworten, die Du im anderen Forum bekommen hast.
 
Oben