如何在Java代码中从Postgresql调用存储过程



在网上搜索为我的春季项目创建数据库的解决方案,当它不存在时,我在stackoverflow中找到了这个主题:

模拟创建数据库如果不存在的PostgreSQL?

和这个存储过程来完成:

DO
$do$
BEGIN
IF EXISTS (SELECT 1 FROM pg_database WHERE datname = 'mydb') THEN
   RAISE NOTICE 'Database already exists'; 
ELSE
   PERFORM dblink_exec('dbname=' || current_database() -- current db
                      , $$CREATE DATABASE mydb$$);
END IF;
END
$do$

我想从我的Java代码运行这个过程。我最初的想法是将这段代码作为String属性包含在这个Service类中:

@Service
public class InstallService {
    private String query = "";
    public boolean create_database(String maquina, String usuario, String senha) {
        return false;
    }
    public boolean create_user(String usuario, String senha, String email) {
        return false;
    }
}

但我刚刚发现这是不可能的。有人能告诉我在课堂上怎么做吗?

我建议您通过当前用于从Spring连接Postgres的任何方法调用存储过程。(即Spring JDBC: http://docs.spring.io/spring/docs/3.0.x/spring-framework-reference/html/jdbc.html;或者MyBatis等)

您可以在template数据库中定义存储过程,然后通过Spring JDBC或您使用的任何方法连接到它,查询形式为:

SELECT stored_proc_name(dbname)

(您还需要让存储过程将数据库名称作为参数。)

编辑:

在下面的评论中,询问是否可以在不向数据库添加任何内容的情况下完成此操作,答案是肯定的:

您可以连接到template1 DB,对pg_catalog运行SELECT查询,看看DB是否存在(如果不存在,您将得到一个空集),如果它不存在,在连接到template1 DB上运行另一个查询来创建DB。

基本上,它将把存储过程分解为其组成部分,并使用JDBC或类似的方法直接从Java调用它们。

最新更新