web-dev-qa-db-ja.com

JDBCでストアドプロシージャを呼び出す方法

宿題の場合、pl/sqlストアドプロシージャを作成して、データベースにファクトリーメンバーを追加する必要があります。

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;

それを済ませた後、私はJava上記の手順を呼び出す必要があります。

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);

エラーをスローし続けるtry catchブロックに上記があります。他のWebサイトで見たものに基づいて、文字列 "in"でいくつかのバリエーションを試しました。in= "{call ADDFACULTYDEPSAL ... in =" call ADDFACULTYDEPSAL ...

ここを見て: MySQL Connector Guide stmtを呼び出し可能なステートメントに変更しようとしました:

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

ただし、3つ以上の変数をプロシージャに渡す必要があるため、この方法を試してもうまくいかないようです。

誰が私が間違っているのか教えてもらえますか?

10
Eric

あなたはほとんどそこにいました:

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