[DBUEB] Aufgabe 8

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 8
hab mal ein kleines test programm geschrieben und versuche es zu compilieren bzw es zum laufen zu bringen.

[list]
[] a8.sqlj schreiben
[
] mit sqlj -compile=true -user=scott/tiger -status -warn a8.sqlj compilieren
[*] mit java a8 starten??
[/list]

oder hab ich da was falsch verstanden?

P.S. Man sollte doch was am connString ändern wie waren nochmal die Daten.

            String url = "jdbc:oracle:thin:@faui02:1521:ora9cip";

Danke im voraus.
Stelios


Hi,

ich kompiliere nur mit

sqlj -compile=true booking.sqlj

, der String ist

“jdbc:oracle:thin:@faui66:1521:ora66”

. Ich habe folgendes Problem, weil ich glaube, dass der mitgelieferte Trigger nicht in Ordnung ist:

SQL> insert into booking values (112694, 110, 'E');
insert into booking values (112694, 110, 'E')
            *
ERROR at line 1:
ORA-20510: Capacity in this class for this plane does NOT exist!
ORA-06512: at "SIWAHOFE.OVERBOOKING_TRIGGER_BIR", line 36
ORA-04088: error during execution of trigger 'SIWAHOFE.OVERBOOKING_TRIGGER_BIR'

Das ist aber nicht wahr:

SQL> select capacity from capacity natural join flight natural join flight_intervals where flight_id=112694;

  CAPACITY
----------
       103

Oder bin ich irgendwie zu bloed?


Ich habe ganz andere Probleme:

unexpected error occurred...
java.lang.NoSuchMethodError: sqlj.runtime.profile.ref.TypeInfoImpl.<init>(Ljava/lang/String;ILjava/lang/String;)V
        at sqlj.codegen.ProfileDecl$EntryInit.addResult(ProfileDecl.java:125)
        at sqlj.codegen.ExecCodegen.addResultTypes(ExecCodegen.java:420)
        at sqlj.codegen.ExecCodegen.getExecStmt(ExecCodegen.java:322)
        at sqlj.codegen.ExecCodegen.createExecStmt(ExecCodegen.java:119)
        at sqlj.codegen.ExecCodegen.createGenerator(ExecCodegen.java:62)
        at sqlj.codegen.ExecCodegen.generate(ExecCodegen.java:542)
        at sqlj.codegen.BaseCodegen.generate(BaseCodegen.java:28)
        at sqlj.codegen.ParseletFactory$ParseletImpl.generate(ParseletFactory.java:153)
        at sqlj.syntax.SqljParselet.generate(SqljParselet.java:128)
        at sqlj.javac.JavaParserSubTokenManager$PositionedParselet.generate(JavaParserSubTokenManager.java:171)
        at sqlj.javac.JavaParserSubTokenManager$TokenManagerParselet.generate(JavaParserSubTokenManager.java:275)
        at sqlj.javac.ASTCompilationUnit.generate(ASTCompilationUnit.java:218)
        at sqlj.translator.Translator.translate(Translator.java:218)
        at sqlj.translator.Translator.translate(Translator.java:189)
        at sqlj.translator.Main.translate(Main.java:124)
        at sqlj.translator.Main.runTranslation(Main.java:99)
        at sqlj.translator.Main.runTranslation(Main.java:92)
        at sqlj.tools.Sqlj.statusMain(Sqlj.java:292)
        at sqlj.tools.Sqlj.main(Sqlj.java:134)
Error: Exception caught: 
Total 1 error.

Sagt euch das was?


Bist du auf einer Sun (faui04a)?

Mein Problem hat aber mit SQLJ noch nichts zu tun - kann man das auch so nachvollziehen?


Mein Verdacht hat sich bestaetigt:

[08:44] siwahofe@faui07b:/proj/i6dbueb/_Support/Aufgabe8$  tail -n 4 README.txt 
Linux problems => solution in "info_classes.txt"
Examples of errors are given in:
- "info_error_sqlj.txt" - after compilation without setting the correct CLASSPATH
- "info_error_java.txt" - after execution without setting the correct CLASSPATH
[08:44] siwahofe@faui07b:/proj/i6dbueb/_Support/Aufgabe8$  cat info_error_sqlj.txt 
faui05a:/proj/i6dbueb/_Support/Aufgabe8> sqlj SQLJTest.sqlj
unexpected error occurred...
java.lang.NoSuchMethodError: sqlj.runtime.profile.ref.TypeInfoImpl.<init>(Ljava/lang/String;ILjava/lang/String;)V
        at sqlj.codegen.ProfileDecl$EntryInit.addResult(ProfileDecl.java:125)
        at sqlj.codegen.ExecCodegen.addResultTypes(ExecCodegen.java:449)
        at sqlj.codegen.ExecCodegen.getExecStmt(ExecCodegen.java:324)
        at sqlj.codegen.ExecCodegen.createExecStmt(ExecCodegen.java:119)
        at sqlj.codegen.ExecCodegen.createGenerator(ExecCodegen.java:62)
        at sqlj.codegen.ExecCodegen.generate(ExecCodegen.java:542)
        at sqlj.codegen.BaseCodegen.generate(BaseCodegen.java:28)
        at sqlj.codegen.ParseletFactory$ParseletImpl.generate(ParseletFactory.java:153)
        at sqlj.syntax.SqljParselet.generate(SqljParselet.java:128)
        at sqlj.javac.JavaParserSubTokenManager$PositionedParselet.generate(JavaParserSubTokenManager.java:171)
        at sqlj.javac.JavaParserSubTokenManager$TokenManagerParselet.generate(JavaParserSubTokenManager.java:275)
        at sqlj.javac.ASTCompilationUnit.generate(ASTCompilationUnit.java:218)
        at sqlj.translator.Translator.translate(Translator.java:218)
        at sqlj.translator.Translator.translate(Translator.java:189)
        at sqlj.translator.Main.translate(Main.java:124)
        at sqlj.translator.Main.runTranslation(Main.java:99)
        at sqlj.translator.Main.runTranslation(Main.java:92)
        at sqlj.tools.Sqlj.statusMain(Sqlj.java:292)
        at sqlj.tools.Sqlj.main(Sqlj.java:134)
Error: Exception caught:
Total 1 error.
faui05a:/proj/i6dbueb/_Support/Aufgabe8>

Mein Problem ist damit aber immer noch nicht geloest :[…


Also du hattest recht, auf ner Sun gehts. Ich habe das gleiche Problem bei dem Insert. Der Trigger sollte ja eigentlich nicht feuern, irgendwo schmeisst der ne DATA NOT FOUND Exception. Aber anscheindend schon vor dem Select capacity into total_… Aber wo?

auf jeden Fall ueberbuchen?
Was sollen wir denn mit den ca. 6600 Fluegen machen, die wir mit den aktueller Passenger-Anzahl nicht voll kriegen?

Also diese 6600 Fluege:
SELECT fi.flight_id, c.capacity, p.passengercount, c.booking_class_id
FROM capacity c, (SELECT count(*) AS passengercount FROM passenger) p, flight f, flight_intervals fi
WHERE f.flight_number = fi.flight_number
AND f.aircraft_id = c.aircraft_id
AND c.capacity > p.passengercount;

Legt ihr da fake Passagiere an, solang der Trigger nicht zuschlaegt oder geht ihr einfach zum naechsten Flug, wenn euch die Passagiere ausgegangen sind?

Uebrigens: der Trigger schlaegt darum mit “keine Capacity gefunden” zu, weil die capacity ja von der Booking Class abhaengt, und z.B. fuer Flug 112694 gibts nur einen Eintrag fuer die Economy Class. Wahrscheinlich hast Du was von einer anderen Booking Class eingefuegt oder versucht einzufuegen, wozu es keine capacity in der Tabelle capacity gab. Es ist aber laut Aufgabenstellung nicht gefordert (meiner Meinung nach), dass wir nur zu solchen Booking Classes buchen sollen, wozu es auch eine capacity gibt.


OK, das klingt prinzipiell plausibel - war mir auch nicht klar, dass die Kapazitaet klassenweise gespeichert wird.

Trotzdem muesste mein obiges Beispiel gehen! Es gibt ja eine Kapazitaet (103) fuer die gegebene Klasse und Flight_ID!

Ich verstehe das nicht…


Bis Du sicher dass Du auch die entsprechende Booking Class inserten moechtest?
Schau Dir mal den Code des Triggers an, eigentlich sehen die Abfragen da korrekt aus.


Also ich kann auch nichts inserten, ohne dass der Trigger losgeht. Ich habe das zufallsmässig einfach mal mehrere 1000 Mal probiert :slight_smile:


OK, dann sind wir uns einig, dass da etwas faul ist.

Toll, dass man auf E-Mails immer so schnelle Antworten bekommt.


Hi,

nachdem ich auch sehr lange über dieser “insert-Anomalie” gebrütet habe, werde ich nun die Ergebnisse meiner Nachforschungarbeit darlegen:

SQL> insert into booking values (112694, 110, 'E');     
 insert into booking values (112694, 110, 'E')
             *
ERROR at line 1:
ORA-20510: Capacity in this class for this plane does NOT exist!
ORA-06512: at "SICHELSN.OVERBOOKING_TRIGGER_BIR", line 36
ORA-04088: error during execution of trigger 'SICHELSN.OVERBOOKING_TRIGGER_BIR'


SQL> insert into booking values (110, 112694, 'E');

1 row created. :)

Grüße,

Elzo


Nein!

Wie komme ich denn auf die Idee, dass die Flight_ID vor der Passenger_ID kommt? Ich kann das im Moment wirklich nicht nachvollziehen, woher diese Idee kommt. Aber anscheinend haben alle ausser mir das auch falsch gemacht…

Danke!


kleinlaut also bei mir funktioniert es jetzt anscheinend auch.

Ich habe zwar die Reihenfolge explizit und damit richtig angegeben - nur habe ich falsche Werte übergeben :slight_smile:


Am sichersten waere es doch im insert-Statement die Attribute aufzuzaehlen. Wer weiss, vielleicht kommt irgendwann noch ein Attribut zur Relation hinzu, oder die Relation wird mit einer verdrehten Attributreihenfolge angelegt etc. Und dann wuerde das Programm nicht mehr zur Relation passen.


OK,
nachdem das jetzt schoen funktioniert habe ich ein neues Problem:

[17:25] siwahofe@faui04a:~/dbueb/aufgabe8$  sqlj -compile=true booking.sqlj
booking.sqlj:47.4-47.151: Warning: Invalid SQL syntax at:
 SELECT booking_class_id FROM capacity NATURAL JOIN aircraft NATURAL JOIN flight NATURAL JOIN flight_intervals WHERE flight_id=112694
                                                                                                              ^^^^^^
Encountered "WHERE" :
Was expecting one of:
    "ON" ...
    "NATURAL" ...
    "PARTITION" ...
    "." ...
    "SUBPARTITION" ...
    "USING" ...
    "SAMPLE" ...
    "JOIN" ...
    "OUTER" ...
    "LEFT" ...
    "RIGHT" ...
    "FULL" ...
    "INNER" ...
    "CROSSING" ...
    "@" ...

Total 1 warning.

Wenn ich dasselbe Statement in SQLPlus eingebe:

SQL> SELECT booking_class_id FROM capacity NATURAL JOIN aircraft NATURAL JOIN flight NATURAL JOIN flight_intervals WHERE flight_id=112694;

B
-
E

Kommt also genau das, was ich haben will - warum meckert SQLJ da? Kann der keine natural joins?


Klammer mal


Thx, habe verschiedene Moeglichkeiten probiert, geht aber nicht.
Dann folgendes:

 #sql bcur = { SELECT booking_class_id FROM capacity INNER JOIN aircraft ON aircraft_id INNER JOIN flight ON aircraft_id INNER JOIN flight_intervals ON flight_number WHERE flight_id=112694 };

Geht auch nicht. Hatte auch die INNERs schon weggelassen, auch nicht.

Die Scheisse regt mich langsam auf. Wie kann ich denn so eine billige Abfrage in SQLJ machen?


Ich klammere immer wie folgt:

((Table1 Inner Join Table2 on condition) inner join Table3 on condition) inner join table4 on condition

Tippe das SQL doch erstmal in sqlplus ein.