Disclaimer: Dieser Thread wurde aus dem alten Forum importiert. Daher werden eventuell nicht alle Formatierungen richtig angezeigt. Der ursprüngliche Thread beginnt im zweiten Post dieses Threads.
[DBUEB] Aufgabe 7
Hi,
ich verstehe die Aufgabe nicht so ganz (und ich bin nicht der einzige, wie ich feststellen musste) - wo ist denn z. B. bei den ganzen Ausdruecken der Operator? Ohne die kann ich doch keine Terme in der DB speichern…
Wenn ich das richtig verstehe, vererben die beiden nicht abstrakten Klassen den Operator “operation” von Expression und überladen die Methode evaluate. Man muss zuerst halt diese Hierarchie definieren und dann in entsprechenden Klassen das Zeug aus Aufgabe 2 speichern.
Ah, OK, danke. Ich sollte doch genauer lesen.
Die naechsten Probleme kommen bestimmt bald…
z.B. wie evaluate als Prozedur einen Rueckgabewert haben kann. “Die Methode evaluate liefert den numerischen Wert des Terms.” Ich denk mal der Wert kommt auf dbms_output.
Wo werden denn die Klammern gespeichert? Werden sie auf Binary_Expressions aufgebrochen? Hmm…
Das wird ein Spass
Ich denke, evaluate () ist eine Memberfunktion mit Rueckgabewert. Sonst duerfte das mit dem Auswerten auch gar nicht funktionieren, denke ich, weil die Ausdruecke beliebig geschachtelt werden duerfen.
Die Klammern werden, denke ich, implizit durch das Einfuegen der Ausdruecke in die DB gesetzt: erstmal wird der Ausdruck a+b hinzugefuegt, Referenz gemerkt, dann c-d hinzugefuegt, Referenz gemerkt, und dann Ref1/Ref2 hinzugefuegt. “Denke” ich.
OK, nach viel try and error bin ich jetzt fertig (denke ich zumindest).
Die Aufgabe 3 ist bei mir jetzt eine PL/SQL-Prozedur, die entsprechende put_lines macht:
********** Alle Terme **********
1: 2
2: 4
3: 7
4: 11
5: 6
6: -4
7: -1.5
8: .5
9: -.5
10: 6.5
11: 8
12: .125
13: 7.125
14: .6477272727272727272727272727272727272727
********** Alle positiven Terme **********
1: 2
2: 4
3: 7
4: 11
5: 6
8: .5
10: 6.5
11: 8
12: .125
13: 7.125
14: .6477272727272727272727272727272727272727
********** Variablenbelegung **********
1: a: 2
2: b: 4
3: c: 7
4: d: 11
Denkt ihr, das ist in Ordnung so, oder kann man das irgendwie mit “normalen” select-Statements machen?
man kann das sicherlich auch mit select machen, doch das Beispiel im Skript kann doch nicht stimmen. Sie selektieren zuerst die passenden Typen durch is-of Check und dann geben alle Attribute mit value(p) aus.
Doch das kann von der Theorie her gar nicht stimmen, weil einfacher select in solchen Fällen immer(!) die gemeinsamen Attribute ausgibt ( vgl. CD Skript). Um spezielle Attribute auszugeben, muss man “outer”-Operation benutzen, die aber in Oracle nicht vorhanden ist:-) Hab in O’Reilly Online Reference die passenden Beispiele gefunden und die benutzen die TREAT-Funktion, die Datentypen konvertiert. Leider stürzt dabei SQL-Plus ab!
hab was geändert und a3.sql auf solaris ausgeführt → es klappt! Einfach mit TREAT in select casten.
Übrigens, hab bei 13 und 14 andere Ergebnisse. 7/11 ~ 0,6. Vielleicht hast du dich vertippt.
Komm mit der aufgabe leider nicht weiter.
Ich schaffe nicht mal die a1.
Könnte mir da jemand weiterhelfen.
Hab probleme mit der Auflösung von operand1 und 2 von Binary Expression.
Die sind ja vom Typ REF Term.
Wie greife ich ber darauf zu??
Wie schaut die Tabelle term_tab aus?
Muss evtl im Objekt Term auser der ID noch was anderes rein???
Kann mir der ein oder andere Tips für die weiteren Teilaufgaben geben.
Vielen dank im voraus.
Stelios
Naja, du musst die Referenz erst aufloesen. Das geht mit
SELECT DEREF(operand1) INTO [Variable vom Typ Term] from dual
oder so. Das steht auch im Skript irgendwo. Dann kannste die evaluate Function aufrufen.
Da sind Objekte vom Typ Term drin. Da aber z.B. Binary Expression von Term abgeleitet ist, kannst du die auch dort reinballern, natuerlich dann mit allen ihren Attributen (ID, operation, operand1/2).
Bei der 13 und 14 hab ich auch bisschen andere Ergebnisse, als die hier geposteten (7/11 = .636363636).
Danke! War kein Vertipper, sondern kein Punkt vor Strich beruecksichtigt beim manuellen „Parsen“ des Terms :]…