我有一个 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)"})')
我相信我无法正确构造字符串。知道这里出了什么问题吗?
Update
调用函数的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.