使用Java运行PL/pgSQL脚本

fzsnzjdm  于 2022-10-15  发布在  Java
关注(0)|答案(5)|浏览(320)

是否可以使用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")));
    }
myss37ts

myss37ts1#

这对我很管用:

Connection con = DriverManager.getConnection("jdbc:postgresql://localhost/postgres", "...", "******");

Statement stmt = con.createStatement();

String create =
  "create function the_answer() \n" +
  "returns integer as $$\n" +
  "begin \n" +
  "   return 42;\n" +
  "end;\n" +
  "$$\n" +
  "language plpgsql;";

// create the function
stmt.execute(create);

// use the function
ResultSet rs = stmt.executeQuery("select the_answer()");
rs.next();
System.out.println("The answer is: " + rs.getInt(1));
5jvtdoz2

5jvtdoz22#

您应该参考PostgreSQL JDBC文档:https://www.postgresql.org/docs/7.4/static/jdbc-callproc.html
如果您的pgSQL返回值,请这样调用:

ResultSet rs = stmt.executeQuery("SELECT * FROM your_func()");
gzszwxb4

gzszwxb43#

Pl/pgSQL是调用存储过程(或函数或包)的特殊情况。
必须使用CallableStatement添加相应的参数。请参见this示例。

pbwdgjma

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**文件中使用的值

System.setProperty("PGPASSFILE", "~/.pgpass");
Process process = Runtime.getRuntime().exec("psql -U <username> -h <hostname> -d <database> -f src/main/resources/schema.sql");
        try (BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()))) {
            String line;
            while ((line = reader.readLine()) != null) {
                System.out.println(line);
            }
        }
        int ret = process.waitFor();
        System.out.printf("Program exited with code: %d%n", ret);

这对你来说应该够了!

oug3syen

oug3syen5#

以下是关于Buid、安装和使用PL/Java for PostgreSQL的说明:
https://tada.github.io/pljava/
这里有一个关于它的例子:你好,世界:
https://tada.github.io/pljava/use/hello.html

相关问题