java - Postgres : Passing custom types from Java to postgres function

标签 java postgresql plpgsql

我有一个 postgres 函数,它将复杂的用户定义类型作为输入。

CREATE OR REPLACE FUNCTION addUser(user IN O_USER) RETURNS VOID
AS
$$
BEGIN

end;
$$ language plpgsql;

CREATE TYPE O_USER AS (
  id NUMERIC,
  name VARCHAR(50),
  addresses O_ADDRESS[]
);


CREATE TYPE O_ADDRESS AS (
  id NUMERIC,
  city VARCHAR(50)
);

现在我需要从 Java 调用该函数。 我的理解是,我需要传递一个字符串,该字符串将由 db 类型转换为 UDT。

当我传递没有地址的用户时,它工作正常。但是如果我也传递地址数组,那么它就会给我错误。

ERROR:  malformed array literal: "{(1"
DETAIL:  Unexpected end of input.
SQL state: 22P02
Character: 23

我也可以使用 postgres select 语句重现该问题。例如以下工作正常

Select * from addUser('(1, "Vishal", {})');

但是当我传递地址时,就会出现问题

Select * from addUser('(1, "Vishal", {(1,"tet")})');
Select * from addUser('(1, "Vishal", {"(1,)"})');
Select * from addUser('(1, "Vishal", {"(1,null)"})')

我相信我无法正确构造字符串。知道这里出了什么问题吗?

更新

调用函数的Java代码

import org.springframework.jdbc.core.SqlParameter;
import org.springframework.jdbc.object.StoredProcedure;

import javax.sql.DataSource;
import java.sql.Types;
import java.util.HashMap;
import java.util.Map;

public class AddUserProcedurePostgres extends StoredProcedure {

    public AddUserProcedurePostgres(DataSource dataSource) {
        super(dataSource, "addUser");
        setFunction(true);

        declareParameter(new SqlParameter("i_User", Types.OTHER, "O_USER"));

        compile();
    }

    public void execute() {

        Map<String, Object> input = new HashMap<>();
        input.put("i_User", "(1, Vishal, array[(1,tet)]::O_ADDRESS[])");

        execute(input);
    }

}

jdbc返回的错误是:

Caused by: org.postgresql.util.PSQLException: ERROR: malformed array literal: " array[(1"
  Detail: Array value must start with "{" or dimension information.

最佳答案

我找到了两种将所需值传递给函数的方法:

  1. 如果 UDT 字符串比较复杂,则创建起来会很困难。最简单的方法是进行逆向工程。在plpgsql中创建UDT并打印它。这样你就可以得到需要从Java传递的字符串。现在在 Java 代码中编写一个逻辑来创建这样的字符串。
  2. 另一种方式是以json格式传递值,并在函数中,解析json并自行构造UDT。

我选择第二种方法,因为它易于维护。

关于java - Postgres : Passing custom types from Java to postgres function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59085449/

相关文章:

java - Hashtable 中键迭代器排序的调试

java - 我怎样才能摆脱这个 ClassCastException? ( java )

java - 在java中从类内部实例化同一类的对象

sql - 每周总计唯一序列号

PostgreSQL 比预期慢

postgresql - SQL 窗口与 PSQL 的差异

arrays - plpgsql text[] varchar[] 数组不工作

java - 获取任何文件的二进制值

ruby-on-rails - 为什么这个查询在 Heroku 上不起作用?

Postgresql:按真或子句的数量计算排名