OUTパラメータを持つストアドプロシージャの実行
通常JDBCを使ってのストアドプロシージャ実行は,CallableStatementインターフェースを使いますが、prepareStatementインターフェースで動作しました。(私の記憶ではOracleはCallabaleStatementでしか操作しなかったと思います)たしかに、OUTPUTパラメータを持つプロシージャをpsqlやpgAdmin4からcallするとあたかもselectの結果セットが返ってきたように出力されるので、prepareStatamentで利用できるのかもしれません。
JDBCからprepareStatamentインターフェースを使った利用例
package conntest;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class ExecStored {
public static void main(String[] args) {
Connection pconn = getPOSConnection();
try {
pconn.setAutoCommit(false);
String callsql = "CALL sp.proc001(?,?,?,?)";
System.out.println(callsql);
PreparedStatement pst = pconn.prepareStatement(callsql);
pst.setInt(1, 0);
pst.setString(2, "");
pst.setInt(3, 0);
pst.setBoolean(4, true);
pst.execute();
ResultSet rs = pst.getResultSet();
rs.next();
int result_code = rs.getInt(1);
String result_message = rs.getString(2);
int insert_row_coun = rs.getInt(3);
System.out.println(String.format("%d,%s,%s", result_code,result_message,insert_row_coun ) );
pst.close();
pconn.close();
} catch (SQLException e) {
e.printStackTrace();
System.exit(1);
}
System.exit(0);
}
public static Connection getPOSConnection() {
Connection pconn = null;
final String URL = "jdbc:postgresql://vm102:5432/soodb";
final String USER = "sooni";
final String PASS = "soopass";
try {
pconn = DriverManager.getConnection(URL, USER, PASS);
} catch (SQLException e) {
e.printStackTrace();
}
return pconn;
}
}
実行結果例
CALL sooni.proceeds_kudamono(?,?,?,?,?)
10,正常終了