package javacodebook.jdbc.callable;

import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;

public class CallableStatementExample {

    public static void main(String[] args) {
        try {
            Class.forName("org.postgresql.Driver");
            Connection con =
                DriverManager.getConnection(
                    "jdbc:postgresql:test",
                    "postgres",
                    "postgres");

            System.out.println(
                "Procedure call without parameters");
            System.out.println("getfullnames():");

            // Das CallableStatement wird hier initialisiert...
            CallableStatement statement =
                con.prepareCall("{call getfullnames()}");
            // ...und gleich ausgeführt
            ResultSet result = statement.executeQuery();
            while (result.next()) {
                System.out.println(result.getString(1));
            }

            System.out.println();
            System.out.println("Procedure call with parameter");
            System.out.println("getfullname(1):");

            // Und weil das gerade zu einfach war, bereiten wir 
            // eine gleichlautende Procedure mit Parameter vor...
            statement = con.prepareCall("{call getfullname(?)}");
            // ...setzen den Parameter...
            statement.setInt(1, 1);
            // ...und führen die Procedure aus
            result = statement.executeQuery();
            while (result.next()) {
                System.out.println(result.getString(1));
            }

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
