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

时间:2014-05-07 01:17:15

标签: java sql postgresql stored-procedures

搜索网络以寻找为我的spring项目创建数据库时不存在的解决方案,我在stackoverflow中找到了这个主题:

Simulate CREATE DATABASE IF NOT EXISTS for 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代码中运行此过程。我最初的想法是将此代码包含在此Service类中的String属性中:

@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;
    }
}

但我发现这是无法做到的。任何人都有兴趣在这堂课内如何做到这一点?

1 个答案:

答案 0 :(得分:2)

我建议您通过目前用于连接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)

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

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

您可以连接到template1数据库,针对SELECT运行pg_catalog查询以查看数据库是否存在(如果不存在,您将获得空集) ,如果它不存在,则在与template1 db的连接上运行另一个查询以创建数据库。

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