# aus Java eine MSSQLServer - Prozedur starten



## wikinger222 (14. Jun 2005)

Hallo,

ich habe im MSSQLServer eine Prozedur geschrieben, welche ich nun mithilfe von Jave aufrufen möchte.
Nun habe ich bisher leider nichts gefunden, was ich auch für mein Problem anwenden konnte.
Die Datenbankverbindung steht schon. Ich kann von Java heraus auch schon auf die Datensätze zugreifen. Nun möchte ich zB. ein Button, welche die Prozedur mit den Parametern startet.

*meine Prozedur:*



> CREATE PROCEDURE Person_loeschen_rückgängig @Ergebnis varchar(255) OUTPUT, @PEID int
> AS
> BEGIN
> 
> ...






*der Aufruf der Prozedur vom SQLServer aus:*



> DECLARE @Ergebnis varchar(255)
> EXECUTE Person_loeschen_rückgängig @Ergebnis OUTPUT, 3
> print @Ergebnis






Für Eure Hilfe bin ich Dankbar 
Gruß


----------



## Energie (14. Jun 2005)

Hallo Wikinger,

genau vor diesem problem steh ich momentan auch.

Habe es versucht mit:

CallableStatement cs = prepareCall("{excecute PROZEDURNAME Variable1, Variable2}");

Wobei der Aufruf der Variablen mir nicht klar erscheint.
...und nicht nur der ;-)

Bin für jede Hilfe dankbar  :applaus:


----------



## Bleiglanz (14. Jun 2005)

geht das nicht mit 

cs.setString 
cs.setInt

usw.

und ? als Substitutionsparameter?


----------



## Gast (14. Jun 2005)

hhmm ... leider nicht


----------



## Guest (14. Jun 2005)

wikinger222 hat gesagt.:
			
		

> Hallo,
> 
> ich habe im MSSQLServer eine Prozedur geschrieben, welche ich nun mithilfe von Jave aufrufen möchte.
> Nun habe ich bisher leider nichts gefunden, was ich auch für mein Problem anwenden konnte.
> ...



hä


----------



## wikinger222 (14. Jun 2005)

Hallo noch einmal,

ich denke, dass Energie schon auf dem richtigen Wege ist.
Aber jede Variante, die ich probierte, klappt nicht :-(

Bitte, bitte, Hilfe ...


----------



## Bleiglanz (14. Jun 2005)

? = call Person_loeschen_rückgängig ?

dann setInt(1,wertfürpeid)

dann executen

dann getString(1)


----------



## wikinger222 (14. Jun 2005)

Hallo,

habe einmal versucht folgenden Code zu modifizieren. Nur er spuckt mir eine Fehlermeldung aus "FALSCHER SYNTAX IN DER NÄHE VON CALL"

Fehlermeldung in der Zeile:
...
callStmt.execute();
System.out.println("TEST8a");
...


Wie händle ich das mit den beiden Parametern?
 - String sql = "CALL Person_loeschen_rückgängig (?, ?)";
(Wobei 'Person_loeschen_rückgängig' der Name der Prozedur ist)
Der erste der beiden Fragezeichen ist der Rückgabeparameter der Prozedur vom Typ varchar. Der zweite ist vom Typ int.




VOLLSTÄDIGER CODE:


```
import java.sql.*;              // JDBC classes 

class Procedure
{
  public static void main(String argv[])
  {
    Connection con = null;
    // URL is jdbc:db2:dbname
    String url = "jdbc:odbc:SQLServer_Projekt";
				
    try
    {
      System.out.println("TEST1a");

      // Datenbank-Treiber laden
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    }
    catch (Exception e)
    {
      System.out.println("TEST1b");
      System.out.println("\nError loading DB2 Driver...\n");
      e.printStackTrace();
    }



    try
    {
      System.out.println("TEST2a");
      // Verbindung zur Datenbank aufbauen
      con = DriverManager.getConnection(url);   

      // Autocommit ausschalten
      con.setAutoCommit(false);                                           

      // Abteilungsname festlegen
//      String dept = "ADMINISTRATION SYSTEMS";
int peid = 4;
//      System.out.println("Abteilung " + dept);

      System.out.println("TEST3a");
      // Anzahl der Projekte in der aktuellen Abteilung ermitteln
int num = callProjectNumber(con, peid);
      System.out.println("TEST10a");

System.out.println("Rückgabe ---" + num+ "---");

//      if (num > 0) {   // Gibt es Projekte in der Abt.?
//         System.out.println("Projekte:");

         // alle Projekte der Abteilung ausgeben
//         callProjects(con, dept);
//      }

      // Informationen ueber die Angestellten der Abteilung ausgeben
//      callEmployees(con, dept);

//      System.out.println("");

      // Beenden der Transaktion und schliessen der Verbindung
      con.commit();
      con.close();
    }
    catch (Exception e)
    {
      try
      { 
        con.rollback();
        con.close();
      } 
      catch (Exception x) 
      { } 
      e.printStackTrace ();
    }
  }

  //--- Bestimmen der Anzahl der Projekte einer Abteilung ---
  public static int callProjectNumber(Connection con, int peid)
  {
  	System.out.println("TEST4a");
    int outNum = 0;
    try {

      // CALL-Anweisung fuer PROJECT_NUMBER vorbereiten
      String sql = "CALL Person_loeschen_rückgängig (?, ?)";
      CallableStatement callStmt = con.prepareCall(sql);
      System.out.println("TEST5a");

      // Ausgabe-Parameter registrieren (OUT-Parameter)
      callStmt.registerOutParameter (2, Types.INTEGER);


	  System.out.println("TEST6a");
      // Parameter (Abt.name) uebergeben (IN-Parameter)
      callStmt.setInt (1, peid);

	  System.out.println("TEST7a");
      // Stored Procedure aufrufen
      callStmt.execute();

	  System.out.println("TEST8a");
      // AusgabeParameter bestimmen
      outNum = callStmt.getInt(2);
    }
    catch (SQLException e)
    {
       System.out.println("TEST8b (catch)");
       System.out.println(e);
    }

	System.out.println("TEST9a");
    return(outNum);
  }
}
```


----------



## Bleiglanz (15. Jun 2005)

kannst du nicht lesen?

siehe meinen post oben

rückgabeparameter vorne, in der form "?=call methodenname"

hast du kein Buch zur Hand wo das drinsteht? Treiberdoku??


----------



## Energie (15. Jun 2005)

sorry Bleiglanz, lesen kann ich, aber ich verstehe (noch) nicht, was du meinst.
"?=call name_der_SQL_Prozedur"

Wenn du es bitte erklären könntest?


----------



## Bleiglanz (15. Jun 2005)

```
CallableStatement proc =
    connection.prepareCall("{ ? = call ichbinzufauldiedokuzulesen (?) }");
```


----------



## wikinger222 (15. Jun 2005)

Hallo Bleiglanz, bei meinem oben geposteten Source entsteht in der Zeile 100  'callStmt.execute();'  ein Fehler.
Und ich weiß nicht, wie ich diesen beseitigen kann.

Wenn mir da jemand einen Tip geben kann, wäre ich dankbar. Und hoffentlich einen Schritt weiter.

Gruß vom wikinger


PS: habe deinen letzten Post erst jetzt gelesen ...


----------



## Bleiglanz (15. Jun 2005)

wikinger222 hat gesagt.:
			
		

> Hallo Bleiglanz, bei meinem oben geposteten Source entsteht in der Zeile 100  'callStmt.execute();'  ein Fehler.


ja und welcher? darfst du ruhig sagen


----------



## wikinger222 (15. Jun 2005)

Hallo, habe eine Lösung gefunden ...
Danke für deinen Tip.


("{ ? = call ichbinzufauldiedokuzulesen (?) }")

Hier das erste ?= wird nur belegt, wenn in der Prozedur mit Return zB ein int-Wert zurückgegeben wird.
Aber in meiner prozedur gibt es kein return.


Meine funktionierende Lösung:


```
import java.sql.*;              // JDBC classes 

class Projekt3
{
  public static void main(String argv[])
  {
    Connection con = null;
    // URL is jdbc:db2:dbname
    String url = "jdbc:odbc:SQLServer_Projekt";
				
    try
    {
      //System.out.println("TEST1a");

      // Datenbank-Treiber laden
      Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
    }
    catch (Exception e)
    {
      System.out.println("\nError loading DB2 Driver...\n");
      e.printStackTrace();
    }


    try
    {
      //System.out.println("TEST2a");
      // Verbindung zur Datenbank aufbauen
      con = DriverManager.getConnection(url);   

      // Autocommit ausschalten
      con.setAutoCommit(false);                                           

int peid = 3;

      //System.out.println("TEST3a");
      // Anzahl der Projekte in der aktuellen Abteilung ermitteln
	  String Ergebnis = ProzedurAufruf(con, peid);
      //System.out.println("TEST10a");

	  System.out.println(Ergebnis);

      // Beenden der Transaktion und schliessen der Verbindung
      con.commit();
      con.close();
    }
    catch (Exception e)
    {
      try
      { 
        con.rollback();
        con.close();
      } 
      catch (Exception x) 
      { } 
      e.printStackTrace ();
    }
  }

  //--- Bestimmen der Anzahl der Projekte einer Abteilung ---
  public static String ProzedurAufruf(Connection con, int peid)
  {
  	//System.out.println("TEST4a");
   // int outNum = 0;
    String Ergebnis="_";
    try {

      // CALL-Anweisung fuer PROJECT_NUMBER vorbereiten
      //String sql = "{? = call Person_loeschen_rückgängig (?, ?)}"; //Das erste ?= wird belegt, wenn in der Prozedur mit Return zB ein int-Wert zurückgegeben wird.
	  String sql = "{call Person_loeschen_rückgängig (?, ?)}";
      CallableStatement callStmt = con.prepareCall(sql);
      //System.out.println("TEST5a");

      // Ausgabe-Parameter registrieren (OUT-Parameter)
      callStmt.registerOutParameter (1, Types.VARCHAR);


	  //System.out.println("TEST6a");
      // 2.Parameter (PEID) uebergeben (IN-Parameter)
      callStmt.setInt (2, peid);

	  //System.out.println("TEST7a");
      // Stored Procedure aufrufen
      callStmt.execute();

	  Ergebnis = callStmt.getString(1);

	  //System.out.println("TEST8a");
      // AusgabeParameter bestimmen
      //outNum = callStmt.getInt(1);
    }
    catch (SQLException e)
    {
       //System.out.println("TEST8b (catch)");
       System.out.println(e);
    }

	//System.out.println("TEST9a");
    return(Ergebnis);
    //ProzedurAufruf = Ergebnis;
  }
}
```


----------



## Gast (16. Jun 2005)

suoer wicky


----------

