Page 1 of 2 1 2 LastLast
Results 1 to 80 of 128

Thread: Bsp. 2C

  1. #1
    Zön's Avatar
    Title
    Hero
    Join Date
    Apr 2004
    Posts
    181
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts

    Bsp. 2C

    Gleich mal zur ersten SQL-Abfrage: Nachdem ja betont wird, dass man die Information für alle Häuser haben möchte würd ich gern wissen ob es hier reicht, bei den Häusern in denen keine Wohnungen vermietet werden einfach auch an den entsprechenden Stellen nichts stehen zu haben, also beispielsweise:

    Straße, Nummer, Anzahl, Fläche
    Straße, Nummer, Anzahl, Fläche
    Straße, Nummer
    Straße, Nummer, Anzahl, Fläche

    Oder muss man auch explizit 0 ausgeben, also:

    Straße, Nummer, Anzahl, Fläche
    Straße, Nummer, Anzahl, Fläche
    Straße, Nummer, 0, 0
    Straße, Nummer, Anzahl, Fläche

    Ersteres hab ich nämlich jetzt mal. Bei Letzterem steh ich allerdings ziemlich an. Ich bring's noch bis Straße, Nummer, Anzahl einwandfrei hin (also auch mit 0 als Anzahl), aber wenn ich die Fläche noch dazubauen soll ist's vorbei.

  2. #2
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by Zön
    Gleich mal zur ersten SQL-Abfrage: Nachdem ja betont wird, dass man die Information für alle Häuser haben möchte würd ich gern wissen ob es hier reicht, bei den Häusern in denen keine Wohnungen vermietet werden einfach auch an den entsprechenden Stellen nichts stehen zu haben, also beispielsweise:

    Ersteres hab ich nämlich jetzt mal. Bei Letzterem steh ich allerdings ziemlich an. Ich bring's noch bis Straße, Nummer, Anzahl einwandfrei hin (also auch mit 0 als Anzahl), aber wenn ich die Fläche noch dazubauen soll ist's vorbei.
    wie hast du ersteres erreicht. bei mir gibt er nämlich für ALLE wohnungen größe und anzahl aus, egal ob vermietet oder nicht...
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  3. #3
    Zön's Avatar
    Title
    Hero
    Join Date
    Apr 2004
    Posts
    181
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Ich bin so frei und poste hier mal einfach meinen Code.
    Das (+) wird im Übrigen für einen OUTER JOIN verwendet.

    Code:
    SELECT y.Strasze, y.Nummer, Wohnungen
    
    FROM Haus y, 
    (SELECT h.Strasze, h.Nummer, COUNT(m.Tuer) AS Wohnungen, SUM(m2) AS Summe
    FROM Haus h, mietet m, Wohnung w
    WHERE m.Strasze = h.Strasze AND
    m.Nummer = h.Nummer AND
    m.Nummer = w.Nummer AND
    m.Strasze = w.Strasze AND
    m.Tuer = w.Tuer
    GROUP BY h.Strasze, h.Nummer)  x
    
    WHERE x.Strasze (+)= y.Strasze AND
    x.Nummer (+)= y.Nummer
    
    GROUP BY y.Strasze, y.Nummer, Wohnungen, Summe;
    Sollte Erklärungsbedarf bestehen, kann ich das auch noch näher erläutern.
    Ich bin mir aber eben sowieso nicht sicher, ob das völlig korrekt ist, weil eben keine Nullen, sondern einfach leere Stellen ausgegeben werden.

  4. #4
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by Zön
    Ich bin so frei und poste hier mal einfach meinen Code.
    Das (+) wird im Übrigen für einen OUTER JOIN verwendet.

    Sollte Erklärungsbedarf bestehen, kann ich das auch noch näher erläutern.
    Ich bin mir aber eben sowieso nicht sicher, ob das völlig korrekt ist, weil eben keine Nullen, sondern einfach leere Stellen ausgegeben werden.
    danke, ich werds mir anschaun. wenn ich draufkomm meld ich mich!
    LG
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  5. #5
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts

    Question Pl

    ich steh momentan ziemlich beim bsp 7 PL/SQL an.
    irgendwie weiß ich nicht so recht wie/wo ich da anfangen soll?! hat schon irgendjemand was zu diesem bsp? bin für jeden tipp dankbar
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  6. #6
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts

    Frage: abfrage 3.

    Ich hab jetzt eine abfrage, die mir Strasse und Hausnummer der Häuser ausgibt, deren sanierungsaufträge NICHT an unterschiedliche Firmen erteilt wurden.

    Wie komm ich jetzt mit hilfe dieser Abfrage auf die umkehrung von häuser?

    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  7. #7
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by brain
    Ich hab jetzt eine abfrage, die mir Strasse und Hausnummer der Häuser ausgibt, deren sanierungsaufträge NICHT an unterschiedliche Firmen erteilt wurden.

    Wie komm ich jetzt mit hilfe dieser Abfrage auf die umkehrung von häuser?

    mit ...NOT IN (dein bisheriges sql-statement)...
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  8. #8
    beat's Avatar
    Title
    Baccalaureus
    Join Date
    Nov 2004
    Posts
    881
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    10
    Thanked in
    5 Posts

    nullen

    @ZÖN

    wenn du willst das statt den leeren stellen ein 0er steht schreib einfach

    select bla,NVL(wertdieleersind,0)

    dann steht dort ein 0er und du erparst dir das where IS NULL

  9. #9
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by - TeMET_noSCE -
    mit ...NOT IN (dein bisheriges sql-statement)...
    Also:

    SELECT haus.Strasse, haus.Nr
    FROM haus
    WHERE ?????????????????? NOT IN (bisheriges Statement);


    Da kann ich doch nicht sagen: WHERE haus.Strasse AND haus.Nr NOT IN (...)

    ...irgendwie steh ich auf der leitung
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  10. #10
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by brain
    Also:

    SELECT haus.Strasse, haus.Nr
    FROM haus
    WHERE ?????????????????? NOT IN (bisheriges Statement);


    Da kann ich doch nicht sagen: WHERE haus.Strasse AND haus.Nr NOT IN (...)

    ...irgendwie steh ich auf der leitung
    ahh, jetzt offenbart sich mir des pudels kern!
    ich hab das jedenfalls anders, hoff es stimmt:
    Code:
    SELECT Sanierungsarbeiten.Strasse, Sanierungsarbeiten.HausNr
    FROM Sanierungsarbeiten, Auftrag
    WHERE Sanierungsarbeiten.ID = Auftrag.ID
    GROUP BY Sanierungsarbeiten.Strasse, Sanierungsarbeiten.HausNr
    HAVING COUNT(DISTINCT Auftrag.Firma) = COUNT(Auftrag.Firma);
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  11. #11
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    naja deine abfrage is ein bisschen kürzer als meine

    auf jeden fall würde mich trotzdem interessieren wie ich das mit NOT IN machen kann
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  12. #12
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    und was machst du da in dieser zeile?

    HAVING COUNT(DISTINCT Auftrag.Firma) = COUNT(Auftrag.Firma);
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  13. #13
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by brain
    und was machst du da in dieser zeile?

    HAVING COUNT(DISTINCT Auftrag.Firma) = COUNT(Auftrag.Firma);
    wenn die anzahl aller verschiedenen Firmen gleich der Anzahl aller Firmen ist, müssen alles verschiedene Firmen sein. oder ist da wo ein denkfehler? bei meinen werten stimmts jedenfalls...
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  14. #14
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    ahhhhhhh verstehe!

    Danke

    (aber die wohnungen die noch keinen auftrag haben werden nicht angezeigt - sollte aber auch egal sein)
    Last edited by brain; 23-11-2005 at 18:18.
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  15. #15

    Title
    Elite
    Join Date
    May 2004
    Location
    Wien 6.
    Posts
    256
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    6
    Thanked in
    1 Post
    hmmm zu sql query 4:
    Geben Sie alle Verwaltungsstellen gemeinsam mit ihrem Budget und der Anzahl der Häuser aus, für die mindestens 2 Sanierungsauschreibungen oder mindestens 2 Sanierungsaufräge existieren.
    ist dieses so schön betonte ODER ein XOR - auf deutsch, was passiert wenn ein Haus 2 ausschreibungen und 2 aufträge hat?

    mfg
    -s.

  16. #16
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by brain
    ahhhhhhh verstehe!

    Danke

    (aber die wohnungen die noch keinen auftrag haben werden nicht angezeigt - sollte aber auch egal sein)
    ich interpretiere die angabe so, dass häuser die noch gar keinen auftrag haben somit auch nicht alle aufträge verschiedenen firmen zugeteilt haben (weil sie eben nich keine aufträge haben...)

    ad 4.: da hab ich eine ziemliche monster-query! und ich habs als OR aufgefasst.
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  17. #17

    Title
    Elite
    Join Date
    May 2004
    Location
    Wien 6.
    Posts
    256
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    6
    Thanked in
    1 Post
    Quote Originally Posted by - TeMET_noSCE -
    ad 4.: da hab ich eine ziemliche monster-query! und ich habs als OR aufgefasst.
    monster-query triffts ziemlich genau!! - sag mal was passiert bei dir falls ein haus 2 aufträge und 2 ausschreibungen hat? ich fürchte bei mir werden die doppelt gezählt...

  18. #18
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by killingspree
    monster-query triffts ziemlich genau!! - sag mal was passiert bei dir falls ein haus 2 aufträge und 2 ausschreibungen hat? ich fürchte bei mir werden die doppelt gezählt...
    oops...ja das is bei mir auch so. aber mit einem NOT IN sollte sich das glaub ich lösen lassen...
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  19. #19
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    hat schon jemand was vom PL/SQL teil gelöst??
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  20. #20
    Poppe's Avatar
    Title
    Baccalaureus
    Join Date
    Oct 2004
    Posts
    589
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts

    2.sqlquery

    hellas kollegen!
    ich steh grad glaub ich komplett auf der leitung bei der 2. abfrage. wie krieg ich da jetzt NUR das maximum angezeigt, bzw. wo muss ich aggregatfunktion max setzten, dass die abfrage richtig läuft? so siehts momentan aus
    Code:
    select p.SVNR, p.Name,count(*) as Anzahl
    from Person p, besitzen b
    where p.SVNR = b.SVNR
    group by p.Name, p.SVNR;
    Ohne Musik wäre das Leben ein Irrtum!

  21. #21
    Paulchen's Avatar
    Title
    Super Moderator
    Join Date
    Oct 2004
    Location
    /home/paulchen
    Posts
    8,104
    Thanks Thanks Given 
    1,956
    Thanks Thanks Received 
    1,465
    Thanked in
    1,002 Posts
    so vielleicht?
    Code:
    select p.SVNR, p.Name,count(*) as Anzahl
    from Person p, besitzen b
    where p.SVNR = b.SVNR
    group by p.Name, p.SVNR
    having count(*)>=all(select count(*) as bla 
    from Person p, besitzen b
    where p.SVNR = b.SVNR
    group by p.Name, p.SVNR);

  22. #22

    Title
    Principal
    Join Date
    Oct 2004
    Posts
    90
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    2.abfrage funktioniert bei mir auch nicht..
    könnte mir jemand sagen, wo man fehler ist(oder ist das ganz falsh?)
    danke

    Code:
    SELECT p.SVNr, p.Name, a.Anzahl
    FROM Personen p
    WHERE a.Anzahl >=ALL (select *
    from Personen p, Besitzt b,Haus h, Wohnung w, COUNT(*) AS Anzahl
    where p.SVNr = b.SVNr AND
    h.Strasse = w.Strasse AND
    h.TuerNR = w.TuerNr AND
    w.Strasse = b.Strasse AND
    w.HausNr = b.HausNr
    w.TuerNr = b.TuerNr) a;

  23. #23
    Poppe's Avatar
    Title
    Baccalaureus
    Join Date
    Oct 2004
    Posts
    589
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    @Paulchen
    danke vielmals! das mit having >= all is natürlich schlau...

    @zori
    kann es sein dass du einfach in der subquery ein group by reinhaun musst???
    aber wofür denn eigentlich die ganzen überprüfungen der straße, haus- und türnummer, wo du doch in besitzen sowieso nur die gekauften wohnungen und ihre eigentümer drinstehn? andere wohnungen kannst getrost vergessen...
    Ohne Musik wäre das Leben ein Irrtum!

  24. #24

    Title
    Principal
    Join Date
    Oct 2004
    Posts
    90
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    ja du hast glaub ich recht, die überprüfung brauch man nicht.
    ich hab auch mit GROUP BY versucht und ohne überprüfung und das zeigt mir gleihen fehler:

    ERROR at line 4:
    ORA-00907: missing right parenthesis

  25. #25
    Poppe's Avatar
    Title
    Baccalaureus
    Join Date
    Oct 2004
    Posts
    589
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    hier mal meine lösung zu frage 5, geht eigentlich ziemlich analog wie 3 denk ich...
    Code:
    select f.name, f.firmensitz
    from firma f, ausschreiben a1, auftrag a2
    where f.name = a1.firma
    and f.name = a2.auftraggeber
    group by f.name, f.firmensitz
    having count(*) <= all(select count(*)
    from firma f, ausschreiben a1, auftrag a2
    where f.name = a1.firma
    and f.name = a2.auftraggeber
    group by f.name, f.firmensitz);
    comment?
    Ohne Musik wäre das Leben ein Irrtum!

  26. #26
    Poppe's Avatar
    Title
    Baccalaureus
    Join Date
    Oct 2004
    Posts
    589
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    nummero 6 is da schon etwas komplizierter, aber ich glaub das sollte stimmen, keine ahnung ob man das auch einfacher lösen kann, allerdings glaub ich sind die views nötig, weil ein outer join nur zwischen 2 tables gemacht werden kann, und nicht mit 3. hier mal mein code:
    Code:
    create view necpairs as
    select f2.name as name, v2.id as id, count(*) as anzahl
    from firma f2, sarnierungsarbeiten s, auftrag a1, haus h, verwaltungsstelle v2
    where f2.name = a1.auftraggeber 
    and a1.sarnierungsarbeitenID = s.ID
    and s.strasse = h.strasse
    and s.hausnummer = h.hausnummer
    and v2.id = h.verwaltetvon
    group by f2.name, v2.id;
    
    create view allPairs as
    select f.name, v.id
    from firma f, verwaltungsstelle v;
    
    select distinct ap.name, ap.id, NVL (Anzahl, 0) as Anzahl
    from necpairs np, allpairs ap
    where np.name (+) = ap.name
    and np.id (+) = ap.id
    group by ap.name, ap.id, anzahl;
    Ohne Musik wäre das Leben ein Irrtum!

  27. #27
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts

    Abfrage 4

    Ist es nicht so, dass jeder Sanierungauftrag auf jeden Fall zuerst ausgeschrieben wird??? -> reicht es dann nicht wenn ich hier nur die Sanierungsausschreibungen für meine berechnung verwende???
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  28. #28

    Title
    Veteran
    Join Date
    Nov 2004
    Posts
    23
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    6
    Thanked in
    2 Posts
    ich glaube es wird unterschieden zwischen sanierungsauftägen, die so vergeben werden und sanierungen, die ausgeschrieben werden
    (es ist ja "in echt" auch of so, dass ab einer bestimmten auftragssumme ausgeschrieben werden MUSS...zumindest im öfftl. bereich).


    hab jetzt mal mit dem pl/sql teil begonnen...das erste war nicht so schwer...nur beim zweiten steh ich irgendwie an. mir kommts bisschen umständlich vor, dass ich nur den schlüssel der einzelnen wohnungen einlesen MUSS und nicht mehr darf (siehe angabe)...ich könnt mir ja gleich nur die wohnungen mit KO anzeigen lassen und dafür dann den preis ausrechnen...
    aber ich lass lieber die finger davon, da "meine" methode zu machen...hab ich beim ersten bsp auch gemacht und bekam ein "denk nicht nach, mach einfach, was in der angabe steht" an den kopf geworfen. *grml*
    also obs ned wurscht wär, wenn das endergebnis das selbe ist. aber ja...
    irgendwer ideen zu pl/sql?

  29. #29

    Title
    Veteran
    Join Date
    Nov 2004
    Posts
    23
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    6
    Thanked in
    2 Posts
    ich glaube es wird unterschieden zwischen sanierungsauftägen, die so vergeben werden und sanierungen, die ausgeschrieben werden
    (es ist ja "in echt" auch of so, dass ab einer bestimmten auftragssumme ausgeschrieben werden MUSS...zumindest im öfftl. bereich).


    hab jetzt mal mit dem pl/sql teil begonnen...das erste war nicht so schwer...nur beim zweiten steh ich irgendwie an. mir kommts bisschen umständlich vor, dass ich nur den schlüssel der einzelnen wohnungen einlesen MUSS und nicht mehr darf (siehe angabe)...ich könnt mir ja gleich nur die wohnungen mit KO anzeigen lassen und dafür dann den preis ausrechnen...
    aber ich lass lieber die finger davon, da "meine" methode zu machen...hab ich beim ersten bsp auch gemacht und bekam ein "denk nicht nach, mach einfach, was in der angabe steht" an den kopf geworfen. *grml*
    also obs ned wurscht wär, wenn das endergebnis das selbe ist. aber ja...
    irgendwer ideen zu pl/sql?

  30. #30
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    kann jemand bitte den code für die VIERTE ABFRAGE posten?

    Ich check die or-gschicht überhauptnicht!!!
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  31. #31
    Poppe's Avatar
    Title
    Baccalaureus
    Join Date
    Oct 2004
    Posts
    589
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    ich hab 4 so, sollte stimmen
    Code:
    create view zweiAuftraege as
    select distinct v.id, v.budget, count(*) as Auftraege
    from verwaltungsstelle v, haus h, sarnierungsarbeiten s, auftrag a
    where v.Id = h.verwaltetvon
    and h.strasse = s.strasse
    and h.hausnummer = s.hausnummer
    and s.id = a.sarnierungsarbeitenid
    group by v.id, v.budget
    having count(s.id) >= '2';
    
    create view zweiAusschreibungen as
    select distinct v.id, v.budget, count(*) as Auftraege
    from verwaltungsstelle v, haus h, sarnierungsarbeiten s, ausschreibung a
    where v.id = h.verwaltetvon
    and h.strasse = s.strasse
    and h.hausnummer = s.hausnummer
    and s.id = a.sarnierungsarbeitenid
    group by v.id, v.budget
    having count(s.id) >= '2';
    
    select tmp.id, tmp.budget, sum(tmp.auftraege) as Auftraege
    from (select * from zweiauftraege
    union all
    select * from zweiausschreibungen) tmp
    group by tmp.id, tmp.budget;
    beim pl/sql steh ich auch ziemlich an....
    Ohne Musik wäre das Leben ein Irrtum!

  32. #32
    Becherer's Avatar
    Title
    Elite
    Join Date
    Oct 2002
    Posts
    406
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Die PL/SQL Beispiele sind halb so wild, eigentlich leichter als die 6 SQL Beispiele.

    Nur beim 9. Beispiel verstehe ich die Angabe nicht so recht.

    Warum soll ich eine Funktion schreiben, welche die niedrigste freie SanierungsID liefern soll?

    Wenn ich Aufträge und Ausschreibungen als spezielle Sanierungen betrachte und designed habe, dann bietet es sich doch an die Ausschreibung mit der selben ID auch in die Tabelle Aufträge zu schreiben.

    Sieht das jemand anders oder verstehe ich was nicht richtig?

    Ohne trifftigen Grund werde ich es nicht implementieren.


  33. #33
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    es will nicht zufällig jemand ein klitzekleines stückchen PL/SQL-Code oder ein paar Tipps zur Implementierung als denkanstoß posten...
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  34. #34

    Title
    Principal
    Join Date
    Mar 2005
    Posts
    48
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    also ein kleiner denkanstoss von mir
    ich hab das bsp.7 so gelöst

    das einzig komplizierte an dem ganzen ist eigentlich die sql abfrage, das drumherum ist dann nicht mehr so schwer....

    hoffe das passt so....

    Code:
    CREATE OR REPLACE PROCEDURE berechnung IS
    
      CURSOR zeiger IS
        select distinct z.SozNr, z.Strasse, z.HausNr, s.Preis, w.Flaeche
            from zahlt z, Wohnung w, Sanierungskategorie s, Haus h, mieten m, besitzen b
               where z.Strasse = h.strasse and z.HausNr = h.HausNr and
            s.Bezeichnung = h.Bezeichnung and
            h.Strasse = w.Strasse and H.HausNr = w.HausNr
            and ((w.TuerNr = m.TuerNr and z.SozNr = m.SozNr and
            m.Strasse = h.Strasse and m.HausNr = h.HausNr) 
            or (w.TuerNr = b.TuerNr and z.SozNr = b.SozNr and
            b.Strasse = h.Strasse and b.HausNr = h.HausNr));
    
      preis_flaeche NUMBER(10,2);
      flaeche INTEGER;
      svnr INTEGER;
      vstrasse varchar(50);
      vhausnr varchar(10);
      preis_gesamt NUMBER(20,2);
        
    BEGIN
      OPEN zeiger;
      LOOP
        FETCH zeiger INTO svnr, vstrasse, vhausnr, preis_flaeche, flaeche;
          EXIT WHEN zeiger%NOTFOUND;
          preis_gesamt := preis_flaeche * flaeche;
    
          UPDATE zahlt SET Betriebskosten = preis_gesamt WHERE SozNr = svnr AND
                                      Strasse = vstrasse AND
                                HausNr = vhausnr;
      END LOOP;    
        
    
    END;
    /
    
    EXECUTE berechnung;

  35. #35
    MadLoki's Avatar
    Title
    Elite
    Join Date
    Dec 2004
    Location
    127.0.0.1
    Posts
    312
    Thanks Thanks Given 
    2
    Thanks Thanks Received 
    8
    Thanked in
    4 Posts
    Quote Originally Posted by Becherer
    Die PL/SQL Beispiele sind halb so wild, eigentlich leichter als die 6 SQL Beispiele.

    Nur beim 9. Beispiel verstehe ich die Angabe nicht so recht.

    Warum soll ich eine Funktion schreiben, welche die niedrigste freie SanierungsID liefern soll?

    Sieht das jemand anders oder verstehe ich was nicht richtig?

    Ohne trifftigen Grund werde ich es nicht implementieren.
    ich weis auch nicht warum...
    werds auch weglassen - oder hat schon jemand ein abgabegespräch gehabt und weis was das soll?

    Quote Originally Posted by Becherer
    Wenn ich Aufträge und Ausschreibungen als spezielle Sanierungen betrachte und designed habe, dann bietet es sich doch an die Ausschreibung mit der selben ID auch in die Tabelle Aufträge zu schreiben.
    es bietet sich bei mir nicht nur an - es ist ja auch ein Foreign Key...

  36. #36
    MadLoki's Avatar
    Title
    Elite
    Join Date
    Dec 2004
    Location
    127.0.0.1
    Posts
    312
    Thanks Thanks Given 
    2
    Thanks Thanks Received 
    8
    Thanked in
    4 Posts
    Quote Originally Posted by Becherer
    Die PL/SQL Beispiele sind halb so wild, eigentlich leichter als die 6 SQL Beispiele.
    kannst du mal posten wie du das mitn Trigger geschafft hast? bekomm das einfach nicht hin...

    wo gehört der definiert etc....

  37. #37
    Becherer's Avatar
    Title
    Elite
    Join Date
    Oct 2002
    Posts
    406
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    z.b. :

    Code:
    CREATE OR REPLACE TRIGGER changedAusschreibung
    AFTER UPDATE ON ausschreibung_data
    REFERENCING NEW as updatedRows OLD as oldRows
    FOR EACH ROW 
    .....Hier Bedingungen für die Zeilen angeben (WHEN.....)
    BEGIN
    ......todo......
    END;
    /


  38. #38
    MadLoki's Avatar
    Title
    Elite
    Join Date
    Dec 2004
    Location
    127.0.0.1
    Posts
    312
    Thanks Thanks Given 
    2
    Thanks Thanks Received 
    8
    Thanked in
    4 Posts
    Quote Originally Posted by Becherer
    z.b. :

    Code:
    CREATE OR REPLACE TRIGGER changedAusschreibung
    AFTER UPDATE ON ausschreibung_data
    REFERENCING NEW as updatedRows OLD as oldRows
    FOR EACH ROW 
    .....Hier Bedingungen für die Zeilen angeben (WHEN.....)
    BEGIN
    ......todo......
    END;
    /
    den Trigger hab ich schon gefunden wie der definiert ist allerdings hab ich ein problem mit der "ausführung":

    ich schreib den trigger so rein:
    Code:
    CREATE TRIGGER trAus 
            AFTER UPDATE ON Ausschreibung
            REFERENCING NEW AS newRow
            FOR EACH ROW
            WHEN (newRow.flag = 'true')
            BEGIN
                checkAll(newRow.ID);
                COMMIT;
            END trAus;
    allerdings schreibt er mir da Fehler.... bin mir auch nicht sicher ob das so geht... kann ich bei WHEN direkt die neue ROW überprüfen? bzw im Begin Teil dann die Procedure aufrufen?

  39. #39
    Becherer's Avatar
    Title
    Elite
    Join Date
    Oct 2002
    Posts
    406
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    muss so aussehen:

    Code:
    checkAll(:newRow.ID);


  40. #40

    Title
    Master
    Join Date
    Mar 2005
    Posts
    170
    Thanks Thanks Given 
    7
    Thanks Thanks Received 
    8
    Thanked in
    7 Posts
    Sorry, Blödsinn
    Last edited by SebastianB; 04-12-2005 at 17:44. Reason: Sorry, Blödsinn

  41. #41
    MadLoki's Avatar
    Title
    Elite
    Join Date
    Dec 2004
    Location
    127.0.0.1
    Posts
    312
    Thanks Thanks Given 
    2
    Thanks Thanks Received 
    8
    Thanked in
    4 Posts
    Quote Originally Posted by Becherer
    muss so aussehen:

    Code:
    checkAll(:newRow.ID);
    danke, allerdings hab ich noch immer ein Problem damit wo das Create Trigger stehen soll:

    entweder so?
    SQL> CREATE TRIGGER .....

    SQL> DECLARE
    PROCEDURE ....
    BEGIN
    END;

    oder gehört es in den Begin Teil? hab echt keine ahnung (und schon vieles ausprobiert )....

  42. #42
    Paulchen's Avatar
    Title
    Super Moderator
    Join Date
    Oct 2004
    Location
    /home/paulchen
    Posts
    8,104
    Thanks Thanks Given 
    1,956
    Thanks Thanks Received 
    1,465
    Thanked in
    1,002 Posts
    also, um hier etwas verwirrung zu stiften:

    Code:
    -- liefert die kleinste Sanierungs-ID groesser oder gleich 1, welche noch nicht vergeben ist
    -- liefert -1 im Fehlerfall
    CREATE FUNCTION GetSanierungsID RETURN INTEGER IS
    	CURSOR c1 IS	/* groesste ID abfragen */
    		SELECT s.ID
    		FROM Sanierungsarbeit s
    		ORDER BY s.ID ASC;
    	this_id INTEGER;
    	last_id INTEGER;
    BEGIN
    	last_id:=0;
    	OPEN c1;
    	LOOP
    		FETCH c1 INTO this_id;
    		IF this_id-last_id>1 OR c1%NOTFOUND THEN
    			CLOSE c1;
    			RETURN last_id+1;
    		END IF;
    		last_id:=this_id;
    	END LOOP;
    EXCEPTION
    	WHEN OTHERS THEN
    		RETURN -1;
    END;
    /
    
    -- vergibt eine ausgeschriebene Sanierungsarbeit an die bestbietende Firma
    CREATE PROCEDURE AuftragVergeben(AusschreibungsID INTEGER) IS 
    	CURSOR c1 IS	/* guenstigstes Angebot */
    		SELECT Firma, Summe
    		FROM Kostenvoranschlag
    		WHERE	Ausschreibung=AusschreibungsID AND
    			Summe<=ALL(	SELECT Summe
    					FROM Kostenvoranschlag
    					WHERE Ausschreibung=AusschreibungsID);
    	var_firma VARCHAR2(100);
    	var_summe VARCHAR2(100);
    	var_sanierungs_id INTEGER;
    	var_verwaltungsstelle INTEGER;
    	var_budget FLOAT;
    	var_hausnummer INTEGER;
    	var_strasse VARCHAR2(100);
    	var_beschreibung VARCHAR2(255);
    
    	/* Exceptions */
    	budget_zu_gering EXCEPTION;
    	kein_kostenvoranschlag EXCEPTION;
    BEGIN
    	OPEN c1;
    	FETCH c1 INTO var_firma, var_summe;
    	IF c1%NOTFOUND THEN
    		CLOSE c1;
    		RAISE kein_kostenvoranschlag;
    	END IF;
    	CLOSE c1;
    
    	SELECT v.ID, v.Jahresbudget, s.Beschreibung, h.Hausnummer, h.Strasse
    		INTO var_verwaltungsstelle, var_budget, var_beschreibung, var_hausnummer, var_strasse
    		FROM Sanierungsarbeit s, Haus h, Verwaltungsstelle v
    		WHERE	s.ID=AusschreibungsID AND
    			s.Strasse=h.Strasse AND
    			s.Hausnummer=h.Hausnummer AND
    			h.Verwaltungsstelle=v.ID;
    
    	IF var_budget<var_summe THEN
    		RAISE budget_zu_gering;
    	END IF;
    
    	var_sanierungs_id:=GetSanierungsID;
    	var_budget:=var_budget-var_summe;
    
    	/* Aenderungen speichern */
    	INSERT INTO Sanierungsarbeit VALUES (var_sanierungs_ID, var_beschreibung, var_strasse, var_hausnummer);
    	INSERT INTO Auftrag VALUES (var_sanierungs_ID, 'in Vorbereitung', var_firma);
    	UPDATE Verwaltungsstelle SET Jahresbudget=var_budget WHERE ID=var_verwaltungsstelle;
    
    	DBMS_OUTPUT.PUT('Auftrag wird um ');
    	DBMS_OUTPUT.PUT(var_summe);
    	DBMS_OUTPUT.PUT(' EUR vergeben an ');
    	DBMS_OUTPUT.PUT_LINE(var_firma);
    	DBMS_OUTPUT.PUT('Verbleibendes Budget der zustaendigen Verwaltungsstelle ');
    	DBMS_OUTPUT.PUT(var_verwaltungsstelle);
    	DBMS_OUTPUT.PUT(': ');
    	DBMS_OUTPUT.PUT_LINE(var_budget);
    EXCEPTION
    	WHEN budget_zu_gering THEN
    		DBMS_OUTPUT.PUT_LINE('Budget zu gering!');
    	WHEN kein_kostenvoranschlag THEN
    		DBMS_OUTPUT.PUT_LINE('Fuer die beendete Ausschreibung existiert kein Kostenvoranschlag.');
    	WHEN OTHERS THEN
    		RETURN;
    END;
    /
    
    -- Trigger, der bei Ende einer Ausschreibung ausgeloest wird
    CREATE TRIGGER AusschreibungTrigger
    AFTER UPDATE ON Ausschreibung
    REFERENCING NEW AS newRecord OLD AS oldRecord
    FOR EACH ROW WHEN (newRecord.beendet=1 AND oldRecord.beendet=0)
    BEGIN
    	AuftragVergeben(:newRecord.ID);
    END AusschreibungTrigger;
    /

  43. #43
    Zön's Avatar
    Title
    Hero
    Join Date
    Apr 2004
    Posts
    181
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Bin grade beim 8. Bsp und würde gern wissen, wie ihr eigentlich die Kaufoption in eurer Datenbank gelöst habt. Ich habe nämlich ein Anfangsdatum und ein Enddatum gespeichert. Bei diesem Bsp. wär's allerdings geschickter einfach nur eine Zahl als Laufzeit zu haben. Ist das auch in Ordnung? Darf ich das noch ändern?
    Hat irgendjemand das Beispiel schon gemacht und könnte da mal ein paar Tips posten?....mal ganz davon abgesehen, dass bei mir PL/SQL überhaupt nicht will, würd ich einfach trotzdem gerne was machen. Vielleicht haut's ja doch irgendwann mal hin...

  44. #44
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Zu viele überflüssige Posts...
    Last edited by brain; 02-12-2005 at 21:20.
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  45. #45
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Zu viele überflüssige Posts...
    Last edited by brain; 02-12-2005 at 21:21.
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  46. #46
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    OK - habs schon gelöst!

    Fehlermeldungen sind gekommen, weil ich variablen deklariert aber nicht initialisiert habe


    hier mein funktionierender code vom 7ten Bsp:

    Code:
    CREATE OR REPLACE PROCEDURE betrkosten IS
    
    
    	CURSOR geskos IS
    		SELECT z.SVNr, z.Strasse, z.Nr,  s.Preis, w.Groesse
    		FROM zahlt z, haus h, sanierungskategorie s, wohnung w, mietet m
    		WHERE z.Strasse = h.Strasse AND z.Nr = h.Nr AND h.S_Bez = s.Bezeichnung AND z.Strasse = w.HausStr AND z.Nr = w.HausNr AND m.SVNr = z.SVNr AND m.Strasse = w.HausStr AND m.Nr = w.HausNr AND m.TuerNr = w.TuerNr
    		UNION
    		SELECT z.SVNr, z.Strasse, z.Nr,  s.Preis, w.Groesse
    		FROM zahlt z, haus h, sanierungskategorie s, wohnung w, hat
    		WHERE z.Strasse = h.Strasse AND z.Nr = h.Nr AND h.S_Bez = s.Bezeichnung AND z.Strasse = w.HausStr AND z.Nr = w.HausNr AND hat.SVNr = z.SVNr AND hat.Strasse = w.HausStr AND hat.Nr = w.HausNr AND hat.TuerNr = w.TuerNr;
    
    	SozVNr	NUMBER(12);
    	Str	VARCHAR(60);
    	Nummer	NUMBER(4);
    	Preis	FLOAT;
    	Groesse	NUMBER(4);
    	Kosten	FLOAT;
    	
    	
    		
    
    BEGIN
    
    	UPDATE zahlt SET Betriebskosten = 0;
    	OPEN geskos;
    	LOOP
    		FETCH geskos INTO SozVNr, Str, Nummer, Preis, Groesse;
    		EXIT WHEN geskos%NOTFOUND;
    		Kosten := Preis * Groesse;
    		UPDATE zahlt SET Betriebskosten = Betriebskosten + Kosten
    			WHERE SozVNr = SVNr AND Str = Strasse AND Nummer = Nr;
    		
    	END LOOP;
    
    END;
    /
    
    EXECUTE betrkosten;
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  47. #47
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts

    bsp.9

    jetzt hab ich mal alles soweit fertig und will testen ob es funktioniert.
    also ändere ich eine ausschreibung von Beendet = 'n' auf j, nur passiert irgendwie nix...

    Update;
    Code:
    UPDATE Ausschreibung
    SET Beendet = 'j'
    WHERE ID = 00333;
    Trigger:
    Code:
    CREATE OR REPLAce TRIGGER t_auss AFTER UPDATE ON Ausschreibung
    REFERENCING NEW AS newRow OLD AS oldRow
    FOR EACH ROW WHEN (newRow.Beendet = 'j' AND oldRow.Beendet = 'n')
    BEGIN
    DBMS_OUTPUT.PUT('triggered!!');
    setAuftrag(:newRow.ID);
    END t_auss;
    /
    es sollte doch zumindest die Zeile "triggered!!" ausgegeben werden, oder??
    hab ich schon erwähnt, dass ich PL/SQL hasse?!
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  48. #48

    Title
    Master
    Join Date
    Jun 2002
    Location
    vienna
    Posts
    168
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    hab folgendes bei beispiel 4 :

    Code:
    SELECT v.Verwid, v.Addresse, v.Budget,
            COUNT(h.Verwid) AS house_min_2_auftraegen
    FROM verwaltungsstelle v, house h(
    		SELECT DISTINCT h.Strasse, h.Hausnummer, h.Verwid
    		FROM house h, san s, auftrag a, ausschreibung aa
    		WHERE   h.Strasse = s.Strasse
        		AND h.Hausnummer = s.Hausnummer
                    AND s.Identifikationsnr = a.Identifikationsnr OR 	
    		s.Identifikationsnr = aa.Identifikationsnr
           		GROUP BY h.Strasse, h.Hausnummer, h.Verwid
            	HAVING COUNT(a.Identifikationsnr) >= 2 OR COUNT(aa.Identifikationsnr) >= 2
    	)	
    WHERE v.Verwid = h.Verwid
    GROUP BY v.Verwid, v.Addresse, v.Budget;
    leider bekomm ich eine fehlermeldung und ich weiss nicht wieso

    kann mir da vielleicht wer helfen ?

    SQL> start abfrage4
    FROM verwaltungsstelle v, house h(
    *
    ERROR at line 3:
    ORA-00933: SQL command not properly ended

    danke !

    edit : der stern gehört unter das ( ...
    Last edited by wjsus; 03-12-2005 at 16:41.

  49. #49
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts

    PL/SQL Bsp.8

    Hier mal meine Lösung zu bsp 8
    Code:
    CREATE OR REPLACE PROCEDURE calcPreis(instr IN Wohnung.Strasse%TYPE,
         inhnr IN Wohnung.HausNr%TYPE,
         intnr IN Wohnung.TuerNr%TYPE) IS
    CURSOR c_kaufw IS
     SELECT  k.Strasse, k.HausNr, k.TuerNr, k.Preis, k.Laufzeit, m.Miete, m.Vertragsdatum
     FROM Kaufwohnung k, mietet m
     WHERE k.Strasse = m.Strasse
     AND k.HausNr = m.HausNr
     AND k.TuerNr = m.TuerNr;
    kstr Kaufwohnung.Strasse%TYPE;
    khnr INTEGER;
    ktnr INTEGER;
    kpreis INTEGER;
    klaufzeit INTEGER;
    mMiete INTEGER;
    mDatum DATE;
    preisNeu INTEGER;
    NO_DATA_FOUND EXCEPTION;
    BEGIN
    OPEN c_kaufw;
    LOOP
     FETCH c_kaufw INTO kstr, khnr, ktnr, kpreis, klaufzeit, mMiete, mDatum;
     EXIT WHEN c_kaufw%NOTFOUND;
     IF instr = kstr AND inhnr = khnr AND intnr = ktnr AND klaufZeit*12 > ((SYSDATE-mDatum)/31)
     THEN  preisNeu := kpreis - mMiete*((SYSDATE-mDatum)/31);
       DBMS_OUTPUT.PUT('Preis = ');
       DBMS_OUTPUT.PUT(preisNeu);
       DBMS_OUTPUT.PUT( '(EUR)');
     ELSIF instr = kstr AND inhnr = khnr AND intnr = ktnr AND klaufZeit*12 <= ((SYSDATE-mDatum)/31) 
     THEN DBMS_OUTPUT.PUT_LINE('Die Wohnung ist bereits abbezahlt.');
     ELSE RAISE NO_DATA_FOUND;
     END IF;
    END LOOP;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Diese Wohnung besitzt keine Kaufoption!');
    END;
    /
    was noch nicht passt: egal ob der Verkaufspreis ausgegeben wird oder die Wohnung schon abbezahlt ist gibt er zur richtigen Ausgabe noch den Satz des ELSE-teils aus: Diese Wohnung besitzt keine Kaufoption!
    falls da noch jemand eine lösung wüsste...
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  50. #50
    Zön's Avatar
    Title
    Hero
    Join Date
    Apr 2004
    Posts
    181
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Zum Thema "...schreiben Sie auch eine Funktion die hierfür die kleinste freie SanierungsID berechnet und returniert". MadLoki und Becherer haben's oben ja schon angesprochen: WOZU???

    Ich nummeriere meine Sanierungsarbeiten fortlaufend und referenziere diese dann in meinen Aufträgen -> ich KANN gar keinen Auftrag mit der logisch nächsten Arbeits-ID erzeugen, weil's einfach nicht geht. Und die Lösung meines ersten Beispiels ist ja auch - bestätigterweise - korrekt.

    Wie auch immer. Ich hab die Funktion geschrieben, verwende sie aber ganz einfach nicht. Vielleicht schreib' ich noch irgendeine Prozedur mit der man sie auch auf Richtigkeit überprüfen kann, damit müssten sie dann eigentlich glücklich sein.

    Wie seht ihr das?

  51. #51

    Title
    Dipl.Ing
    Join Date
    Mar 2005
    Location
    Villach
    Posts
    1,090
    Thanks Thanks Given 
    29
    Thanks Thanks Received 
    7
    Thanked in
    6 Posts
    Wie siehts aus mit dem 9. Beispiel?
    Ich blick nicht durch .
    Wäre es möglich das ganze Beispiel mal zu posten, das wäre sehr nett von euch.......

  52. #52
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts

    Parameter übergeben

    Bei Bsp. 8 heißt es wir sollen die Schlüssel der Wohnung als Parameter übergeben.


    Wie wird das realisiert?????
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  53. #53
    Zön's Avatar
    Title
    Hero
    Join Date
    Apr 2004
    Posts
    181
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Also meine Lösung zum 9. Beispiel ist Folgende:

    Code:
    CREATE OR REPLACE PROCEDURE concludeBP (inID IN INTEGER, str IN varchar, num IN INTEGER) IS
    
    CURSOR pointer IS
           SELECT i.Firma, i.KostenVA, v.ID, v.Budget
           FROM interessiert i, Haus h, Verwaltungsstelle v
           WHERE i.Strasze = str AND
           i.Nummer = num AND
           i.ArbeitsID = inID AND
           h.Strasze = i.Strasze AND
           h.Nummer = i.Nummer AND
           h.Verwaltung = v.ID
           GROUP BY i.Strasze, i.Nummer, i.ArbeitsID, i.Firma, i.KostenVA, v.    ID, v.Budget
           HAVING KostenVA <= ALL (SELECT KostenVA
                      FROM interessiert
                      WHERE Strasze = str AND
                      Nummer = num AND
                      ArbeitsID = inID);
    
    street CONSTANT varchar(20) := str;
    number CONSTANT INTEGER := num;
    ID CONSTANT INTEGER := inID;
    company varchar(15);
    adminID INTEGER;
    adminBudget INTEGER;
    bestEstimate INTEGER;
    lowBudget EXCEPTION;
    
    BEGIN
    
    OPEN pointer;
         
        FETCH pointer INTO company, bestEstimate, adminID, adminBudget;
        
        IF adminBudget >= bestEstimate THEN
           insert into Auftrag values (ID, street, number, 'happening', company);
           UPDATE Verwaltungsstelle SET Budget = Budget-bestEstimate
                        WHERE ID = adminID;
        ELSE
           RAISE lowBudget;
        END IF;
    
    EXCEPTION
        WHEN lowBudget THEN
             DBMS_OUTPUT.PUT_LINE ('Budget zu gering!');
    END;
    /
    
    
    
    CREATE OR REPLACE FUNCTION getNextID (str IN varchar, num IN INTEGER) RETURN INTEGER IS
    
    maxID INTEGER;
    nextID INTEGER;
    
    BEGIN
    
        SELECT MAX(ID)
        into maxID
        FROM Sanierungsarbeit
        WHERE Strasze = str AND
        Nummer = num
        GROUP BY Strasze, Nummer;
    
        nextID := maxID+1;
        RETURN nextID;
    
    EXCEPTION
    
        WHEN NO_DATA_FOUND THEN
             nextID := 1;
             RETURN nextID;
    END;
    /
    
    CREATE OR REPLACE TRIGGER checkState AFTER UPDATE ON Ausschreibung
    REFERENCING NEW AS newRow OLD AS oldRow
    FOR EACH ROW WHEN (newRow.gueltig = 'TRUE' AND oldRow.gueltig = 'FALSE')
    BEGIN
        concludeBP(:newRow.ArbeitsID, :newRow.Strasze, :newRow.Nummer);
    END checkState;
    /
    getNextID verwende ich nie und habe ich auch nur geschrieben, damit ich beweisen kann, dass ich dazu in der Lage bin eine solche Funktion zu schreiben. Ansonsten macht sie keinen Sinn, wozu ich auch oben schon Stellung genommen habe.

    Ansonsten denke ich, funktioniert das so. Werd's aber noch ausführlicher testen, als bisher.

    Zwei Fragen noch:
    1.) Hat jemand von euch, diese COMMIT, ROLLBACK, oder SAVEPOINT Statements verwendet?
    2.) Wie siehts mit den Clustern aus? Hat das schon jemand gemacht? Wie geht man da am Besten vor? Könnte ja einfach alle tables in ein cluster klatschen :coolsmile...

  54. #54
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    rollback etc hab ich nie verwendet.
    bei den clustern hab ich einfach geschaut welche attribute am öftesten gejoint werden (Strasse, HausNr, TuerNr) und hab die in einen Cluster gepackt.
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  55. #55
    Becherer's Avatar
    Title
    Elite
    Join Date
    Oct 2002
    Posts
    406
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by - TeMET_noSCE -
    rollback etc hab ich nie verwendet.
    bei den clustern hab ich einfach geschaut welche attribute am öftesten gejoint werden (Strasse, HausNr, TuerNr) und hab die in einen Cluster gepackt.
    Ich habe ein Rollback und savepoint beim letzten Beispiel verwendet, da ich ja in mehreren Tabellen was eintragen muss.
    Schlägt ein insert fehl sollte ja das andere in zusammenhang stehende insert auch rüchgängig gemacht werden.


  56. #56

    Title
    Elite
    Join Date
    Oct 2003
    Posts
    323
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts

    Abfrage 4

    Hat sich erledigt.
    Last edited by Studigel; 05-12-2005 at 15:18.

  57. #57

    Title
    Master
    Join Date
    Oct 2004
    Posts
    125
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    ne frage zu Bsp8:
    wie kann es sein, dass bei der Ausführung ein Fehler auftritt, weil er auf ein PL/SQL Statement nicht zugreifen kann? ..

    ich habe
    CREATE OR REPLACE PROCEDURE <name> (Parameter)
    Curser c1 IS
    /....deklariert....mittels SELECT-Abfrage/
    ;

    +Variablen;

    BEGIN
    OPEN c1;
    LOOP
    FETCH c1 INTO Variablen;
    EXIT WHEN c1%NOTFOUND;
    IF (..... Abfrage) Then (......) ;

    ELSEIF ....... usw.


    und der Compiler sagt jedesmal er kann auf das Statement IF nicht zugreifen und das ist der einzige Fehler (nix falsche Variable oder sonst was)... wie kann das bitte sein ?? ich habe sicherlich jeden Strichpunkt gesetzt... bin alles zick mal durchgeganen.

    Wenn die "Auswertung" falsch wäre... na gut ok. dann heißt es nochmal ans Zeichenbrett zurück und den Code neuschreiben... aber wie kanns sowas gegeben ?

  58. #58

    Title
    Elite
    Join Date
    Oct 2004
    Posts
    471
    Thanks Thanks Given 
    3
    Thanks Thanks Received 
    14
    Thanked in
    10 Posts
    Wenn man das mit der niedrigsten ID machen will muss man ja auch die ID der Sanierungsarbeit ändern und damit auch die der Ausschreibung.
    Dann gibts aber einen Trigger Error(mutating table oder so), den Trigger disable und dann wieder enable geht irgendwie auch nicht. Wie sollte man das dann machen?

  59. #59
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by - TeMET_noSCE -
    was noch nicht passt: egal ob der Verkaufspreis ausgegeben wird oder die Wohnung schon abbezahlt ist gibt er zur richtigen Ausgabe noch den Satz des ELSE-teils aus: Diese Wohnung besitzt keine Kaufoption!
    falls da noch jemand eine lösung wüsste...
    Versuch mal statt "DBMS_OUTPUT.PUT( '(EUR)');" ein "DBMS_OUTPUT.PUT_LINE( '(EUR)');"


    Bei mir hats geholfen - hatte das selbe problem.
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  60. #60
    - TeMET_noSCE -'s Avatar
    Title
    Elite
    Join Date
    Jun 2004
    Location
    the desert of the real
    Posts
    270
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by brain
    Versuch mal statt "DBMS_OUTPUT.PUT( '(EUR)');" ein "DBMS_OUTPUT.PUT_LINE( '(EUR)');"


    Bei mir hats geholfen - hatte das selbe problem.
    hey, funktioniert echt!! danke! (warum versteh ich zwar nicht ganz, aber PL/SQL is mir schon von anfang an ein rätsel gewesen...)

    jetzt hab ich nur mehr ein problem:
    bei bsp.9 wird beim Trigger zwar ausgelöst (PUT_LINE('triggered!!'), aber die prozedur SETAUFTRAG(xxx) wird nie aufgerufen...
    Code:
    CREATE OR REPLACE FUNCTION minSanID RETURN INTEGER IS
    CURSOR c_maxID IS
    SELECT s.ID
    FROM Sanierungsarbeiten s
    ORDER BY s.ID ASC;
    itID INTEGER;
    maxID INTEGER;
     
    BEGIN
    maxID := 0;
    OPEN c_maxID;
    LOOP
    FETCH c_maxID INTO itID;
    IF itID - maxID > 1
    OR c_maxID%NOTFOUND
    THEN CLOSE c_maxID;
    RETURN maxID+1;
    END IF;
    maxID := itID;
    DBMS_OUTPUT.PUT_LINE('IN MINSAN!!');
    END LOOP; 
    CLOSE c_maxID;
    COMMIT;
    EXCEPTION
    WHEN OTHERS 
    THEN RETURN -1;
    END;
    /
    CREATE OR REPLACE PROCEDURE SETAUFTRAG(aussID INTEGER) IS
     
    CURSOR c_KVA IS
    SELECT Firma, Betrag
    FROM machtKostenvoranschlag
    WHERE Ausschreibung = aussID
    AND Betrag <= ALL(SELECT Betrag
    FROM machtKostenvoranschlag
    WHERE Ausschreibung = aussID);
    xfirma machtKostenvoranschlag.Firma%TYPE;
    xbetrag INTEGER;
    xsanID INTEGER;
    xverwID INTEGER;
    xbudget INTEGER;
    xstr INTEGER;
    xhnr INTEGER;
    xtnr INTEGER;
    xbeschr Sanierungsarbeiten.Beschreibung%TYPE;
    exceeds_budget EXCEPTION;
    noKVA EXCEPTION;
    BEGIN
    OPEN c_KVA;
    FETCH c_KVA INTO xfirma, xbetrag;
    IF c_KVA%NOTFOUND
    THEN CLOSE c_KVA;
    RAISE noKVA;
    END IF;
    CLOSE c_KVA;
    SELECT v.ID, v.Budget, s.Beschreibung, h.Strasse, h.HausNr
    INTO xverwID, xbudget, xbeschr, xstr, xhnr
    FROM Sanierungsarbeiten s, Haus h, Verwaltungsstelle v
    WHERE s.ID = aussID
    AND s.Strasse = h.Strasse
    AND s.HausNr = h.HausNr
    AND h.VerwaltungsID = v.ID;
    IF xbudget < xbetrag
    THEN RAISE exceeds_budget;
    END IF;
    xsanID := minSanID;
    xbudget := xbudget - xbetrag;
    DBMS_OUTPUT.PUT_LINE('IN AUFTRAG!!');
    INSERT INTO Sanierungsarbeiten VALUES (xsanID, xbeschr, xstr, xhnr);
    INSERT INTO Auftrag VALUES (xsanID, 'Planung', xfirma);
    UPDATE Verwaltungsstelle SET Budget = xbudget WHERE ID = xverwID;
    DBMS_OUTPUT.PUT('Auftrag wird um ');
    DBMS_OUTPUT.PUT(xbetrag);
    DBMS_OUTPUT.PUT(' EUR vergeben an ');
    DBMS_OUTPUT.PUT_LINE(xfirma);
    DBMS_OUTPUT.PUT('Verbleibendes Budget der zustaendigen Verwaltungsstelle ');
    DBMS_OUTPUT.PUT(xverwID);
    DBMS_OUTPUT.PUT(': ');
    DBMS_OUTPUT.PUT_LINE(xbudget);
     
    COMMIT; 
    EXCEPTION
    WHEN exceeds_budget THEN DBMS_OUTPUT.PUT_LINE('Budget zu gering!');
    WHEN noKVA THEN DBMS_OUTPUT.PUT_LINE('Kein Kostenvoranschlag vorhanden!');
    WHEN OTHERS THEN RETURN;
    END;
    /
    CREATE OR REPLACE TRIGGER TA AFTER UPDATE ON Ausschreibung
    REFERENCING NEW AS newRow OLD AS oldRow
    FOR EACH ROW WHEN (newRow.Beendet = 'J' AND oldRow.Beendet = 'N')
    BEGIN
    DBMS_OUTPUT.PUT_LINE(:newRow.ID);
    SETAUFTRAG(:newRow.ID);
    DBMS_OUTPUT.PUT_LINE('triggered!!');
    END TA;
    /
    Morpheus: Everything begins with choice.
    Merovingean: No. Wrong. Choice is an illusion, created between those with power, and those without.

    :coolsmile

  61. #61
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by - TeMET_noSCE -
    hey, funktioniert echt!! danke! (warum versteh ich zwar nicht ganz, aber PL/SQL is mir schon von anfang an ein rätsel gewesen...)
    Also bei mir war das glaub ich so, dass er immer das ergebnis erst bei der nächsten abfrage hingeschrieben hat, aber die Meldung keine wohnung vorhanden gleich.

    ...aber is ja egal - hauptsache es funktioniert

    werd jetzt mal das 9te bsp machen.
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  62. #62

    Title
    Master
    Join Date
    Oct 2004
    Posts
    115
    Thanks Thanks Given 
    4
    Thanks Thanks Received 
    1
    Thanked in
    1 Post

    SQL Abfrage 4

    Hat irgendwer zufällig die 4. Abfrage, die auch richtig läuft.

    Bin da im Moment zu blöd dafür. Komm da auf keinen grünen Zweig!

    Danke.

  63. #63

    Title
    Veteran
    Join Date
    Jun 2004
    Posts
    18
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by Poppe
    ich hab 4 so, sollte stimmen..

    group by v.id, v.budget
    Ich denke man müsste auch die Hausnummer und Hausstraße in die group Klausel nehmen...
    Du zählst hier ja die Sanierungsaufträge bzw. Ausschreiben pro Verwaltungsstelle, es geht aber ( zumindest so wie ich die Angabe interpretiere ) klar um die Häuser, welche 2 Sanierungsaufträge/ausschreiben zugeordnet haben.

    In deinem Fall wird auch 2 gezählt wenn 2 Häuser mit jeweils 1 Sanierungsauftrag einer Verwaltungsstelle zugeordnet sind, sollte aber 0 rauskommen (Anm. wenn ich die Angabe richtig verstanden habe )

  64. #64

    Title
    Master
    Join Date
    Oct 2004
    Posts
    115
    Thanks Thanks Given 
    4
    Thanks Thanks Received 
    1
    Thanked in
    1 Post
    So sehe ich das auch. Das ist auch genau der Grund warum ich beim vierten gerade total anstehe! Es soll nur die Anzahl der Häuser ausgegeben werden, auf die die Bedingung zutrifft!

    Edit: So müssts eigentlich passen oder:

    /*View für die Häuser mit zwei Aufträgen vereinigt mit den Häusern mit zwei Ausschreibungen*/
    CREATE VIEW SaniBed AS
    SELECT h.VerwaltungsstelleID, h.Strasse, h.Hausnr
    FROM Haus h, Sanierungsarbeit s, Auftrag a
    WHERE h.Strasse = s.HausStrasse AND h.Hausnr = s.HausHausnr AND
    s.ID = a.ID
    GROUP BY h.VerwaltungsstelleID, h.Strasse, h.Hausnr, HAVING COUNT (a.ID) >=2
    UNION
    SELECT h.VerwaltungsstelleID, h.Strasse, h.Hausnr
    FROM Haus h, Sanierungsarbeit s, Ausschreibung a
    WHERE h.Strasse = s.HausStrasse AND h.Hausnr = s.HausHausnr AND
    s.ID = a.ID
    GROUP BY h.VerwaltungsstelleID, h.Strasse, h.Hausnr HAVING COUNT (a.ID) >=2;

    /*Abfrage selbst*/
    SELECT v.ID, v.Budget, NVL(Haeuser, 0) AS Haeuser
    FROM Verwaltungsstelle v,
    /*Selektiert ID und Count um danach richtig zu joinen*/
    (SELECT s.VerwaltungsstelleID, COUNT(*) AS Haeuser
    FROM Sanibed s
    GROUP BY s.VerwaltungsstelleID, s.Strasse, s.Hausnr) c
    WHERE c.VerwaltungsstelleID (+) = v.ID;

    MfG
    Last edited by GeronimoV; 07-12-2005 at 17:50.

  65. #65

    Title
    Principal
    Join Date
    Dec 2004
    Posts
    77
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by cary
    also ein kleiner denkanstoss von mir
    ich hab das bsp.7 so gelöst

    das einzig komplizierte an dem ganzen ist eigentlich die sql abfrage, das drumherum ist dann nicht mehr so schwer....

    hoffe das passt so....

    Code:
    CREATE OR REPLACE PROCEDURE berechnung IS
    
      CURSOR zeiger IS
        select distinct z.SozNr, z.Strasse, z.HausNr, s.Preis, w.Flaeche
            from zahlt z, Wohnung w, Sanierungskategorie s, Haus h, mieten m, besitzen b
               where z.Strasse = h.strasse and z.HausNr = h.HausNr and
            s.Bezeichnung = h.Bezeichnung and
            h.Strasse = w.Strasse and H.HausNr = w.HausNr
            and ((w.TuerNr = m.TuerNr and z.SozNr = m.SozNr and
            m.Strasse = h.Strasse and m.HausNr = h.HausNr) 
            or (w.TuerNr = b.TuerNr and z.SozNr = b.SozNr and
            b.Strasse = h.Strasse and b.HausNr = h.HausNr));
    
      preis_flaeche NUMBER(10,2);
      flaeche INTEGER;
      svnr INTEGER;
      vstrasse varchar(50);
      vhausnr varchar(10);
      preis_gesamt NUMBER(20,2);
        
    BEGIN
      OPEN zeiger;
      LOOP
        FETCH zeiger INTO svnr, vstrasse, vhausnr, preis_flaeche, flaeche;
          EXIT WHEN zeiger%NOTFOUND;
          preis_gesamt := preis_flaeche * flaeche;
    
          UPDATE zahlt SET Betriebskosten = preis_gesamt WHERE SozNr = svnr AND
                                      Strasse = vstrasse AND
                                HausNr = vhausnr;
      END LOOP;    
        
    
    END;
    /
    
    EXECUTE berechnung;
    ist das auch richtig? weil wenn jemand jetzt mehrere wohnungen in einen haus hätte würde doch nur die letzte berechnet werden oder? man müsste entweder in der query (my choice) oder im programm selber aufsummieren, denke ich, oder?

    EDIT: is die aufgabenstellung so zu verstehen dass vorhandene svnr, hausnummer, strasse - tupel mit den richtigen betriebskosten upgedated werden oder dass aus den mietet und gehört relations alles berechnet wird und dann dort ALLES (svnr,hausnummer,str, betribskosten) eingetragen wird? beim 2. müsste man aufjedenfall voher den inhalt löschen.
    So eine "redundante" datenspeicherung is sowieso $%/&%$ aber is halt ein ue bsp.
    Last edited by meR++; 08-12-2005 at 16:30.

  66. #66

    Title
    Principal
    Join Date
    Dec 2004
    Posts
    77
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts

    Bsp 9

    Kann mir jemand verraten warum man die kleineste SanID sucht und dann einen NEUEN!? sanierungsauftrag und sanarbeit erstellt?
    Sanierungsarbeit und Ausschreibung sind doch schon vorhanden in der Datenbank, ich muss nur einen neuen Auftrag erstellen mit der gleichen id,, wie die Ausschreibung. (Ausschreibung und Auftrag sind doch generalisierungen von Sanarbeiten, oder?)

    Wenn ich das so mache dann hab ich ja die selbe sanarbeit 2x drinn nur mit verschiedenen schlüsseln.wo ist mein denkfehler?

    ich versteh die welt nicht mehr

  67. #67

    Title
    Master
    Join Date
    Nov 2003
    Posts
    120
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by meR++
    Kann mir jemand verraten warum man die kleineste SanID sucht und dann einen NEUEN!? [...]
    hatte gestern abgabe und hab dem tutor das auch gefragt.
    seine antwort: eine sanierungsarbeit kann nur entweder ein auftrag oder eine ausschreibung sein. deswegen musst dann ne neue id für den neuen auftrag suchen.

  68. #68
    Erdbeere's Avatar
    Title
    Master
    Join Date
    Apr 2004
    Location
    Vienna/Istanbul
    Posts
    164
    Thanks Thanks Given 
    2
    Thanks Thanks Received 
    2
    Thanked in
    2 Posts
    Quote Originally Posted by gpmct
    hatte gestern abgabe und hab dem tutor das auch gefragt.
    seine antwort: eine sanierungsarbeit kann nur entweder ein auftrag oder eine ausschreibung sein. deswegen musst dann ne neue id für den neuen auftrag suchen.
    Wie war dein Abgabe? Was hat der Tutor gefragt? War deine alle Loesungen korrekt?
    If I was a Rich Girl.. See, I'd have all the money in the world, if I was a wealthy girl.....

  69. #69

    Title
    Master
    Join Date
    Nov 2003
    Posts
    120
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by Erdbeere
    Wie war dein Abgabe? Was hat der Tutor gefragt? War deine alle Loesungen korrekt?
    also, zuerst mal hats ziemlich lange gedauert. fast ne halbe stunde.
    als erstes hat er geschaut, ob ich cluster und index gemacht hab und mich gefragt wozu die eigentlich gut sind.
    dann hat er mich fast alle sql-abfragen gefragt. wie die funktionieren usw.
    eine abfrage hat bei mir nicht gestimmt. er hat aber gemeint, wenn der rest stimmt, dann is das kein problem. ( )
    dann musst ich noch das bsp mit der betriebskostenberechnung erklären und das bsp mit dem trigger. wobei ich beim letzten bsp, das mit der kleinsten ID-suche nicht gescheit gemacht hab. hat aber gemeint, das wär nicht so ein großer fehler und hab dann ein ok bekommen. sollt mir meine fehler, aber noch genauer anschauen, weil solche sachen dann beim übungstest kommen werden.

  70. #70
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by gpmct
    hatte gestern abgabe und hab dem tutor das auch gefragt.
    seine antwort: eine sanierungsarbeit kann nur entweder ein auftrag oder eine ausschreibung sein. deswegen musst dann ne neue id für den neuen auftrag suchen.

    Meine Frage nun: wie kann ich in meiner procedure einer Variablen den Rückgabewert der Function zuweisen, die die nächstmögliche ID ausrechnet?

    variable v_ergebnis number;

    execute :v_ergebnis := funktion_test;


    funktioniert irgendwie nicht...


    EDIT: einfach variable := funktion; funktioniert doch...
    Last edited by brain; 09-12-2005 at 18:52.
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  71. #71
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Also irgendwie paßt da was beim triggern nicht.

    Code:
    CREATE OR REPLACE TRIGGER obende
    	AFTER UPDATE ON ausschreibung
    	REFERENCING NEW AS new_row OLD AS old_row
    	FOR EACH ROW WHEN (old_row.Beendet = 'nein' AND new_row.Beendet = 'ja')
    	BEGIN
    		erteilen(:new_row.ID);
    END obende;
    /
    was is da falsch?

    bekomme folgende fehlermeldungen:
    ORA-04091: table U0025724.AUSSCHREIBUNG is mutating, trigger/function may not see it
    ORA-04088: error during execution of trigger 'U0025724.OBENDE'



    EDIT: OK, is schon klar was da nicht passt: ich will dann in der procedur die werte beschreibung und status von ausschreibung auslesen, damit ich die in auftrag übernehmen kann. soll ich die jetzt einfach leer lassen oder wie kann ich die trotzdem übernehmen - beim updaten werden die ja nicht verändert???
    Last edited by brain; 09-12-2005 at 20:06.
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  72. #72

    Title
    Principal
    Join Date
    Sep 2002
    Posts
    86
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    du übergibst die benötigten Attribute beim Aufruf der Prozedur:

    so in etwa:

    erteilen(:new_row.ID, :new_row.beschreibung, new_row.status);

  73. #73
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Quote Originally Posted by Spiderman
    du übergibst die benötigten Attribute beim Aufruf der Prozedur:

    so in etwa:

    erteilen(:new_row.ID, :new_row.beschreibung, new_row.status);
    super - danke
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  74. #74

    Title
    Master
    Join Date
    Oct 2004
    Posts
    115
    Thanks Thanks Given 
    4
    Thanks Thanks Received 
    1
    Thanked in
    1 Post

    Bsp 8

    Hab Bsp 8 versucht so zu lösen:

    CREATE OR REPLACE PROCEDURE Kalkpreis (qTuernr IN Wohnung.Tuernr%TYPE, qStrasse IN Wohnung.HausStrasse%TYPE, qHausnr IN Wohnung.HausHausnr%TYPE) IS
    CURSOR Zeiger IS
    /*Gibt die Kaufwohnungen der View vermietet aus*/
    SELECT v.Tuernr, v.HausStrasse, v.HausHausnr, v.Miete, v.Vertragsdatum, k.Preis, k.Laufzeit
    FROM vermietet v, Kaufwohnung k
    WHERE k.Tuernr = v.Tuernr AND
    k.WohnungStrasse = v.HausStrasse AND
    k.WohnungHausnr = v.HausHausnr
    GROUP BY v.Tuernr, v.HausStrasse, v.HausHausnr, v.Miete, v.Vertragsdatum, k.Preis, k.Laufzeit;

    Tuernr INTEGER;
    Strasse CHAR;
    Hausnr CHAR;
    Preis INTEGER;
    Laufzeit INTEGER;
    Miete INTEGER;
    Vertragsdatum DATE;
    Kaufpreis INTEGER;

    NO_DATA_FOUND EXCEPTION;
    BEGIN
    OPEN Zeiger;
    LOOP
    FETCH Zeiger INTO Tuernr, Strasse, Hausnr, Miete, Vertragsdatum, Preis, Laufzeit;
    EXIT WHEN Zeiger%NOTFOUND;
    IF qStrasse = Strasse AND qHausnr = Hausnr AND qTuernr = Tuernr AND Laufzeit*12 > ((SYSDATE-Vertragsdatum)/31)
    THEN Kaufpreis := Preis - Miete*((SYSDATE-Vertragsdatum)/31);
    DBMS_OUTPUT.PUT('Kaufpreis = ');
    DBMS_OUTPUT.PUT(Kaufpreis);
    DBMS_OUTPUT.PUT_LINE(' Euro');
    END IF;
    IF qStrasse = Strasse AND qHausnr = Hausnr AND qTuernr = Tuernr AND Laufzeit*12 <= ((SYSDATE-Vertragsdatum)/31)
    THEN DBMS_OUTPUT.PUT_LINE('Kaufpreis = 0 Euro');
    ELSE RAISE NO_DATA_FOUND;
    END IF;
    END LOOP;
    EXCEPTION
    WHEN NO_DATA_FOUND THEN DBMS_OUTPUT.PUT_LINE('Diese Wohnung besitzt keine Kaufoption!');
    END;
    /

    EXECUTE Kalkpreis;


    Wenn ich das Ding nun ausführe kommt aber das hier:

    ERROR at line 1:
    ORA-06550: line 1, column 7:
    PLS-00306: wrong number or types of arguments in call to 'KALKPREIS'
    ORA-06550: line 1, column 7:
    PL/SQL: Statement ignored



    Hat irgendwer eine Idee was da falsch ist bzw. was ich da ändern muss. Bin echt schon total verzweifelt.

    Wär echt nett wenn ihr mir da weiterhelfen könntet!

    MfG

  75. #75
    brain's Avatar
    Title
    Elite
    Join Date
    Jun 2003
    Posts
    477
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Naja du musst schon die parameter der Wohnung übergeben
    Dasselbe was wir jeden Abend machen, Pinky! - Wir versuchen die Weltherrschaft an uns zu reißen...

  76. #76

    Title
    Master
    Join Date
    Oct 2004
    Posts
    115
    Thanks Thanks Given 
    4
    Thanks Thanks Received 
    1
    Thanked in
    1 Post
    Edit: Hat sich erledigt. War nur zu blöd die Prozedur richtig aufzurufen!
    Last edited by GeronimoV; 11-12-2005 at 20:27.

  77. #77
    Zön's Avatar
    Title
    Hero
    Join Date
    Apr 2004
    Posts
    181
    Thanks Thanks Given 
    0
    Thanks Thanks Received 
    0
    Thanked in
    0 Posts
    Oh, ihr Menschen, die ihr bereits Cluster erzeugt habt! Wie verhält sich's damit? Die drei Attribute die bei mir am häufigsten gejoint werden, sind Straße, Nummer und Tür. Soll ich jetzt einfach alle Tables nehmen, in denen diese Attribute vorkommen und gemeinsam in ein cluster packen? Das wären nämlich dann ziemlich viele.
    Und was ist dann eigentlich der clusterKey? Bei Wohnung und Haus wäre das Straße und Nummer, oder? Weil ja das die gemeinsamen primary keys sind?

  78. #78

    Title
    Principal
    Join Date
    Mar 2005
    Location
    Wv
    Posts
    86
    Thanks Thanks Given 
    7
    Thanks Thanks Received 
    2
    Thanked in
    2 Posts

    Bsp 7

    Quote Originally Posted by meR++
    ist das auch richtig? weil wenn jemand jetzt mehrere wohnungen in einen haus hätte würde doch nur die letzte berechnet werden oder? man müsste entweder in der query (my choice) oder im programm selber aufsummieren, denke ich, oder?

    EDIT: is die aufgabenstellung so zu verstehen dass vorhandene svnr, hausnummer, strasse - tupel mit den richtigen betriebskosten upgedated werden oder dass aus den mietet und gehört relations alles berechnet wird und dann dort ALLES (svnr,hausnummer,str, betribskosten) eingetragen wird? beim 2. müsste man aufjedenfall voher den inhalt löschen.
    So eine "redundante" datenspeicherung is sowieso $%/&%$ aber is halt ein ue bsp.
    jo, exakt. find auch, dass es nicht korrekt ist.

    ich versuch gerade die m² pro person und haus zu ermitteln, um die betriebskosten korrekt berechnen zu können. nur steh ich da irgendwie auf der leitung, weil einige wohnungen mehrfach gezählt werden.
    die anzahl der wohnungen kann ich ja mit DISTINCT richtig bestimmen, aber bei den m² kann ich ja nur schwer DISTINCT verwenden. hätten dann zwei wohnungen die selbe fläche, so würde dann ja eine verschwinden?

    hat vl jemand eine idee?

    Code:
    SELECT DISTINCT bbk.PSVNr, bbk.HStrasse, bbk.HHausNr, s.Preism2, COUNT(w.TuerNr), SUM (w.m2)
            FROM bezahltBK bbk, Wohnung w, Sanierungskategorie s, Haus h, mieten m, besitzen b
            WHERE     bbk.HStrasse = h.Strasse AND
                bbk.HHausNr = h.HausNr AND
                s.Bezeichnung = h.SanKatID AND
                h.Strasse = w.HStrasse AND 
                h.HausNr = w.HHausNr AND 
                (    (w.TuerNr = m.WTuerNr AND 
                    bbk.PSVNr = m.MSVNr AND
                    m.WStrasse = h.Strasse AND 
                    m.WHausNr = h.HausNr) OR
                    (w.TuerNr = b.WTuerNr AND 
                    bbk.PSVNr = b.PSVNr AND
                    b.WStrasse = h.Strasse AND 
                    b.WHausNr = h.HausNr)
                )
            GROUP BY bbk.PSVNr, bbk.HStrasse, bbk.HHausNr, s.Preism2;
    Last edited by fremder; 11-12-2005 at 21:10.
    ...keep it simple, stupid

  79. #79

    Title
    Master
    Join Date
    Oct 2004
    Posts
    115
    Thanks Thanks Given 
    4
    Thanks Thanks Received 
    1
    Thanked in
    1 Post
    Quote Originally Posted by fremder
    hat vl jemand eine idee?
    hab das Ganze so gemacht. Müsste eigentlich passen.

    Code:
    CREATE VIEW werwo AS
    SELECT z.PersonSVNr, z.HausStrasse, z.HausHausnr, w.m2, s.Preism2
    FROM zahlt z, haus h, wohnung w, sanierungskat s
    WHERE z.HausStrasse = h.Strasse AND z.HausHausnr = h.Hausnr AND
    	w.HausStrasse = h.Strasse AND w.HausHausnr = h.Hausnr AND
    	h.SanierungskatBezeichnung = s.Bezeichnung
    GROUP BY z.PersonSVNr, z.HausStrasse, z.HausHausnr, w.m2, s.Preism2;
    
    
    /*Prozedur zur Betriebskostenberechnung*/
    CREATE OR REPLACE PROCEDURE Kostenkalk IS
    
    	CURSOR Zeiger IS
    		/*Enthält schon die Summe der Quadratmeter des Hauses*/ 
    		select ww.PersonSVNr, ww.HausStrasse, ww.HausHausnr, SUM(ww.m2) AS m2, ww.Preism2
    		FROM werwo ww
    		GROUP BY ww.PersonSVNr, ww.HausStrasse, ww.HausHausnr, ww.Preism2;
    	SVNr INTEGER;
    	Strasse VARCHAR(25);
    	Hausnr VARCHAR(5);
    	m2 NUMBER(3);
    	Preis NUMBER(5,2);
    	Kosten NUMBER (10,2);
    
    BEGIN
    	OPEN Zeiger;
    	LOOP
    		FETCH Zeiger INTO SVNr, Strasse, Hausnr,  m2, Preis;
    			EXIT WHEN zeiger%NOTFOUND;
    			Kosten := Preis * m2;
    
    			UPDATE zahlt SET Betriebskosten = Kosten
    			WHERE PersonSVNr = SVNr AND HausStrasse = Strasse AND HausHausnr = Hausnr;
    	END LOOP;
    END;
    /

  80. #80

    Title
    Principal
    Join Date
    Mar 2005
    Location
    Wv
    Posts
    86
    Thanks Thanks Given 
    7
    Thanks Thanks Received 
    2
    Thanked in
    2 Posts
    Quote Originally Posted by GeronimoV
    hab das Ganze so gemacht. Müsste eigentlich passen.
    hallo!

    danke erstmal für die schnelle antwort!

    aber sieh dir mal die ergebnisse an, die dein view bringt. bei mir sind da nämlich auch manchmal wohnungen angeführt, welche die person gar nicht gemietet hat oder besitzt.
    irgendwie fehlt dir die verbindung zu prüfen, wer welche/wieviel fläche in einem haus mietet bzw. besitzt.

    einen weiteren tipp hätt ich auch noch:
    bei jedem pl/sql solltes es ein exception handling geben (lt. tutor). d.h. z.b. folgenden block einfügen:
    Code:
    EXCEPTION
        WHEN OTHERS THEN
        ROLLBACK;
    ...keep it simple, stupid

Page 1 of 2 1 2 LastLast

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •