web-dev-qa-db-fra.com

Comment appeler une procédure stockée dans JDBC

Pour les devoirs, je dois créer une procédure stockée pl/sql pour ajouter un membre à une base de données

CREATE OR REPLACE PROCEDURE ADDFACULTYDEPTSAL
  (facid IN NUMBER,
  facname IN VARCHAR,
  depID IN NUMBER)
AS
  sal NUMBER;
BEGIN
  CALCSALDEPT(depID, sal);
  IF sal >= 50000
  THEN 
    sal := sal*.9;
  ELSE
    IF sal >= 30000
    THEN
      sal := sal*.8;
    END IF;
  END IF;

  INSERT INTO FACULTY(fid, fname, deptid, salary)
  VALUES(facid, facname, depID, sal);
END ADDFACULTYDEPTSAL;

Cela fait, je dois faire un appel à Java pour ladite procédure, ce que je suis fatigué de faire avec:

Statement stmt = dbConnection.createStatement();
String in;
if(a == 1){
    in = "ADDFACULTYDEPTSAL("
        + fid.getText() + "','"
        + fname.getText() + "','"
        + did.getText() + "')";
} else {
    in = "ADDFACULTYUNISAL("
        + fid.getText() + "','"
        + fname.getText() + "','"
        + did.getText() + "')";
}
stmt.executeQuery(in);

J'ai ce qui précède dans un bloc try catch qui continue de générer une erreur. J'ai essayé plusieurs variantes de la chaîne "in" en fonction de ce que j'ai vu sur d'autres sites: in = "{call ADDFACULTYDEPSAL ... in =" call ADDFACULTYDEPSAL ...

en regardant ici: MySQL Connector Guide J'ai également essayé de changer stmt en une instruction appelable en tant que telle:

CallableStatement stmt;
if(a == 1){
    stmt = dbConnection.prepareCall("{call ADDFACULTYDEPTSAL(?,?,?)}");
} else {
    stmt = dbConnection.prepareCall("{call ADDFACULTYUNISAL(?,?,?)}");
}

Cependant, essayer de cette façon ne semble pas fonctionner car j'ai besoin de passer plus de deux variables dans la procédure.

Quelqu'un peut-il me dire ce que je fais mal?

10
Eric

Vous y étiez presque:

String call = (a == 1 ? "{call ADDFACULTYDEPTSAL(?,?,?)}"
                      : "{call ADDFACULTYUNISAL(?,?,?)}");
try (CallableStatement stmt = dbConnection.prepareCall(call)) {
    stmt.setInt(1, Integer.parseInt(fid.getText()));
    stmt.setString(2, fname.getText());
    stmt.setInt(3, Integer.parseInt(did.getText()));
    stmt.execute();
}
18
Andreas