Rückgabe einer stored Procedure

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Rückgabe einer stored Procedure

    Hallo,

    ich soll im Rahmen einer Hausarbeit ein Datenbanksystem aufbauen und daraus Daten mit Java ausgeben.

    Unter anderem rufe ich ich eine Stored Procedure mit einem übergebenen String auf. Am Ende der Procedure ist eine Select-Anweisung die ich in meinem Programm darstellen möchte.
    Jedoch bekomme ich bei Aufruf der Prozedur immer nichts zurück.

    Einsetzen tue ich Sybase SQL Anywhere 9
    Java 5.0 und verwende den beigelegten iAnywhere JDBC-Treiber.

    Mein Problem liegt meine ich darin, dass ich in der Prozedur mehrere Select- Anweisungen benutze und die Rückgabe der Prozedur, die Lösung der ersten Select-Anweisung ist.
    Ich habe hierzu ein kleines Beispiel:

    // Eine Stored Procedure
    ALTER PROCEDURE "DBA"."anfrage"()
    BEGIN
    Select * FROM SCHEMA;
    Select * FROM Kategorie;
    END

    // Aufruf in Java
    Statement cstm = connection.createStatement();
    ResultSet rs = cstm.executeQuery ("dba.anfrage");


    rs besitzt anschließend das Resultset von der Tabelle Schema anstatt der Tabelle Kategorie.
    Laut mehreren Quellen, müsste aber eigentlich die letzte Select- Anweisung die Rückgabe sein.

    Jedoch ist es so, wenn ich direkt über das Sybase Interactive SQL Fenster die Procedure aufrufe, so bekomme ich wie ich erwartet habe, die letzte SELECT-Anweisung zurückgeliefert und somit die Tabelle Kategorie.

    Hoffe mir kann das wer erklären bzw eine Lösung geben was ich ändern muss.

    gruß
  • Keine Lösung, eher eine Anregung: warum zwei SELECT-Anweisungen? Evtl. kannst du sie ja zu einer zusammenfassen (Subselect, Views, ...) und dein Problem ist (zwar nicht gelöst, aber) verschwunden.

    Zum Aufruf einer Stored Procedure habe ich bei [1] folgende Syntax gefunden:

    Quellcode

    1. Statement cstmt = connection.prepareCall("{ call anfrage() }");
    2. ResultSet rs = cstmt.executeQuery();

    Allerdings habe ich Java mit JDBC noch nie benutzt und kenne den Unterschied zu deiner Variante nicht. Kommt da etwas anderes raus?

    Gruß,
    Paul

    [1] JDBC-Programmierung
  • Deine Schreibweise hatte ich auch schon probiert, doch ändert leider nichts.
    Die wird mein ich auch nur benutzt, wenn man dort einen variablen Teil hat den man noch mit cstm.setString(1,"Wert") setzen will.

    Weniger SELECT-Anweisungen sind leider nicht möglich. Um genauer zu sein, wertet die Prozedur einen String aus der Form "Wert1 AND Wert 2 OR Wert3 usw" aus, durchsucht alle Werte nach diesem und gibt sie zurück.
    Dadrin wird eine temporäre Tabelle angelegt, die Pro Wert Mit DELETE und INSERT diese Tabelle ändert.
    Auszug:

    Quellcode

    1. ELSEIF (operand='OR') THEN
    2. INSERT INTO TempTab (number) SELECT DokumentID FROM Kategorie as KA WHERE ka.wert=word AND NOT EXISTS (Select * from TempTab as tmp where tmp.number=Ka.dokumentid) GROUP BY DokumentID


    Ich habe auch einfach versucht eine weitere Prozedur drumherum zu kapseln, die einfach die Prozedur aufruft, doch das hat auch nicht geklappt.