Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java代码中如何从Postgresql调用存储过程_Java_Sql_Postgresql_Stored Procedures - Fatal编程技术网

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

Java代码中如何从Postgresql调用存储过程,java,sql,postgresql,stored-procedures,Java,Sql,Postgresql,Stored Procedures,在web上搜索解决方案,以便在spring项目不存在时为其创建数据库,我在stackoverflow中找到了以下主题: 使用此存储过程来完成以下操作: 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_

在web上搜索解决方案,以便在spring项目不存在时为其创建数据库,我在stackoverflow中找到了以下主题:

使用此存储过程来完成以下操作:

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代码中运行这个过程。我最初的想法是将此代码作为字符串atribute包含在此服务类中:

@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的任何方法调用存储过程。i、 e.Spring JDBC:;或者也许是MyBatis,等等

您可以在(比如)模板数据库中定义存储过程,然后通过Spring JDBC或您正在使用的任何方法连接到它,并使用以下形式的查询:

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

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

您可以连接到template1 DB,对pg_目录运行SELECT查询,查看该DB是否存在。如果不存在,您将得到一个空的设置。如果它不存在,请在与template1 DB的连接上运行另一个查询以创建该DB


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

但考虑到我没有数据库,应该在哪里创建存储过程?或者,更清楚地说,我应该把代码放在上面的什么地方?这就是我所说的模板。这实际上是一个数据库。请记住,每个DB都会用到它,所以它不应该塞满很多特定于DB的东西,但是对于这样的实用函数,我认为它是一个合理的位置。你也可以为这个函数和任何类似的函数创建一个特殊的模板数据库。但我只有实体类,它们是数据库中表的模板。我从来没有使用过数据库的模板。好吧,阅读你给我指示的链接,我猜我需要在数据库中创建一个新模板,对吗?我希望创建并运行此过程,而无需手动向服务器添加内容。有什么办法吗?或者我理解错了,我不需要在服务器中创建任何东西?应该已经有了一个模板-它是创建数据库引导的基础。它应该被称为template1。看见另外,请注意,pg_数据库是一个特殊的目录表,在DBs之间共享。您应该能够通过连接到Template1DB来访问它。