繁体   English   中英

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

[英]How call a stored procedure from Postgresql in the Java code

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

为 PostgreSQL 模拟 CREATE DATABASE IF NOT EXISTS?

用这个存储过程来完成:

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
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)

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM