PostgreSQL Java 教程: 调用 PostgreSQL 存储函数

八月 9, 2023

摘要:在本教程中,您将学习如何使用 JDBC 调用 PostgreSQL 存储函数。

PostgreSQL 允许您使用用户定义的存储函数将业务逻辑集中放在数据库层。只有当您可以在应用程序层(例如从 Java 应用程序)调用这些存储函数时,它才有意义。

幸运的是,PostgreSQL JDBC 驱动程序完全支持 PostgreSQL 存储函数。

我们将向您展示如何使用 JDBC 调用内置存储函数以及用户定义的存储函数。

调用内置存储函数

我们将调用一个内置的字符串函数initcap(),该函数将字符串中的每个单词大写

若要调用initcap()函数,请执行以下步骤:

  1. 首先,建立数据库连接
  2. 其次,创建一个 CallableStatement 对象并注册 OUT 参数。
  3. 第三,执行函数调用并获取返回结果。

下面App类的connect()方法,建立数据库连接,并返回一个 Connection 对象。

public class App {

    private final String url = "jdbc:postgresql://localhost/dvdrental";
    private final String user = "postgres";
    private final String password = "postgres";

    /**
     * Connect to the PostgreSQL database
     *
     * @return a Connection object
     * @throws java.sql.SQLException
     */
    public Connection connect() throws SQLException {
        return DriverManager.getConnection(url, user, password);
    }

    //...
}

下面的callBuiltInSF()方法接受一个字符串,并返回其正确的大小写形式。

public class App {

    // ...   

    /**
     * Call a built-in stored function demo
     *
     * @param s
     * @return
     */
    public String properCase(String s) {
        String result = s;
        try (Connection conn = this.connect();
                CallableStatement properCase = conn.prepareCall("{ ? = call initcap( ? ) }")) {
            properCase.registerOutParameter(1, Types.VARCHAR);
            properCase.setString(2, s);
            properCase.execute();
            result = properCase.getString(1);
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
        return result;
    }
 

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        App app = new App();
        System.out.println(app.properCase("this is the actor list:"));
    }
}

程序将输出以下结果:

This Is The Actor List:

调用用户定义的存储函数

我们将使用我们在返回表的 PL/pgSQL 函数教程中开发的存储函数get_film

请参阅下面的getFilms()方法:

    /**
     * Call the get_film stored function
     * @param pattern
     * @param releaseYear
     */
    public void getFilms(String pattern, int releaseYear) {

        String SQL = "SELECT * FROM get_film (?, ?)";
        try (Connection conn = this.connect();
                PreparedStatement pstmt = conn.prepareStatement(SQL)) {

            pstmt.setString(1,pattern);
            pstmt.setInt(2,releaseYear);
            ResultSet rs = pstmt.executeQuery();

            while (rs.next()) {
                System.out.println(String.format("%s %d",
                        rs.getString("film_title"),
                        rs.getInt("film_release_year")));
            }
        } catch (SQLException e) {
            System.out.println(e.getMessage());
        }
    }

getFilms 方法接受两个参数:

  1. 用于搜索影片的模式。
  2. 电影上映年份。

它是如何工作的。

  1. 首先,连接到 dvdrental 数据库。
  2. 接下来,使用调用 get_film 存储函数的查询,创建一个 PreparedStatement 对象。
  3. 然后,使用 setString 和 setInt 方法将参数传递给语句。
  4. 之后,执行语句。
  5. 最后,处理结果集并输出电影数据。

让我们执行程序,显示在 2006 年发行并以字符串"er"结尾的电影。

 App app = new App();
 app.getFilms("%er",2006);

postgresql jdbc stored function

在本教程中,我们向您展示了如何使用 JDBC API 调用 PostgreSQL 存储函数。