Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Probleme bei einer Procedure

Dieses Thema im Forum "Oracle" wurde erstellt von Gigoloart.inc, 30 Juli 2013.

  1. Gigoloart.inc

    Gigoloart.inc Neuer Benutzer

    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
     
  2. akretschmer

    akretschmer Datenbank-Guru


    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?
     
  3. Gigoloart.inc

    Gigoloart.inc Neuer Benutzer

    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.
     
  4. Gigoloart.inc

    Gigoloart.inc Neuer Benutzer

    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?
     
  5. akretschmer

    akretschmer Datenbank-Guru

    Du kannst Dir mal http://www.postgresql.org/docs/9.2/static/queries-with.html anschauen, daß erklärt rekursive Abfragen für PostgreSQL, Oraggle sollte sehr ähnlich / gleich so funktionieren. Ansonsten solltest Du das, was Du da als Pseudocode formuliert hast, in pl/sql formulieren können.
     
  6. Gigoloart.inc

    Gigoloart.inc Neuer Benutzer

    Und kannst Du mir beim Code helfen? Wenn ich es könnte, würde ich es ja selbst machen :)
     
  7. akretschmer

    akretschmer Datenbank-Guru

    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.
     
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden