jdbc

PostgreSQL JDBCからストアドプロシージャの実行

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,正常終了

今回使ったストアドプロシージャはこちら

スポンサーリンク
タイトルとURLをコピーしました