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