是否可以使用Java运行PL/pgSQL脚本?我正在从Java代码创建postgres db,需要在此db上创建一些函数。
我知道我可以像这样使用DriverManager运行任何SQL脚本:
Connection connection = DriverManager.getConnection(
connectionToDbUrl,
getDbUser(),
getDbPassword());
Statement statement = connection.createStatement()
statement.execute("select * from table);
但它不会执行PL/pgSQL脚本。有什么主意吗?
编辑:我是说PL/pgSQL
编辑2:我找到了错误谢谢@a_horse_with_no_name解决方案。我使用BufferedReader从文件中读取脚本并连接所有行。在每一行的末尾添加“\n”可以解决问题。
try (BufferedReader br = new BufferedReader(new FileReader(resource.getFile())))
{
statement.execute(br.lines().collect(Collectors.joining(" \n")));
}
5条答案
按热度按时间myss37ts1#
这对我很管用:
5jvtdoz22#
您应该参考PostgreSQL JDBC文档:https://www.postgresql.org/docs/7.4/static/jdbc-callproc.html
如果您的pgSQL返回值,请这样调用:
gzszwxb43#
Pl/pgSQL是调用存储过程(或函数或包)的特殊情况。
必须使用CallableStatement添加相应的参数。请参见this示例。
pbwdgjma4#
我遇到了同样的问题,但我以一种略有不同的方式解决了它,我希望在这里与其他任何人分享。
我发现使用JDBC方法相当笨拙。我想使用一种尽可能接近从终端使用pgqsl的方法。
要求1:作为使用该方法的前提,您应该已经能够在终端上运行pgsql命令。
要求2:用户主目录中的.pgpass文件或PGPASSFILE引用的文件可以包含密码,以便在连接需要密码时使用(但没有指定其他密码)。此文件应包含以下格式的行:
hostname:port:database:username:password
因此,在您的主目录中(或者其他您可能想要的地方)创建一个文件**.pgpass**,因为您以后无论如何都需要引用这个位置)
要求3:.pgpass需要限制访问,否则会出现错误-
.pgpass" has group or world access; permissions should be u=rw (0600) or less
。要解决此问题,只需将文件chmod至少设置为600chmod 600 ~/.pgpass
需求4:添加这段Java代码来执行您的SQL脚本。将<用户名>、<主机名>和<数据库>替换为您在**.pgpass**文件中使用的值
这对你来说应该够了!
oug3syen5#
以下是关于Buid、安装和使用PL/Java for PostgreSQL的说明:
https://tada.github.io/pljava/
这里有一个关于它的例子:你好,世界:
https://tada.github.io/pljava/use/hello.html