【问题标题】:JDBCIO Calling Postgres Routine (Stored Proc) which takes a Custom Object Type as parameterJDBCIO 调用以自定义对象类型为参数的 Postgres 例程(存储过程)
【发布时间】:2019-03-26 22:00:53
【问题描述】:

我正在尝试调用一个将自定义对象类型作为参数的 Postgres 例程。

create type person_type as
(
  first        varchar,
  second varchar,
  is_real     boolean
);

我的例程(存储过程):

create function person_routine(person person_type)
returns void
language plpgsql
as $$

BEGIN
  INSERT INTO person(first, second, is_real) VALUES 
(person.first,person.second,person.is_real);

END;
$$;

然后我尝试创建一个 Java 类来表示自定义类型:

import java.sql.SQLData;
import java.sql.SQLException;
import java.sql.SQLInput;
import java.sql.SQLOutput;

public class PersonType implements SQLData {

public String first;
public String second;
public boolean is_real;
private String sql_type;

@Override
public String getSQLTypeName() throws SQLException {
    return sql_type;
}

@Override
public void readSQL(SQLInput stream, String typeName) throws SQLException {
    sql_type = typeName;
    second = stream.readString();
    first = stream.readString();
    is_real = stream.readBoolean();
}

@Override
public void writeSQL(SQLOutput stream) throws SQLException {
    stream.writeString(first);
    stream.writeBoolean(is_real);
    stream.writeString(second);
}
}

然后我尝试像这样执行代码:

.apply(JdbcIO.<Person>write()
                            .withDataSourceConfiguration(JdbcIO.DataSourceConfiguration.create(
                                    "org.postgresql.Driver", configuration.GetValue("postgres_host"))
                                    .withUsername(configuration.GetValue("postgres_username"))
                                    .withPassword(configuration.GetValue("postgres_password")))
                            .withStatement("SELECT person_routine(?)")
                            .withPreparedStatementSetter(new JdbcIO.PreparedStatementSetter<Person>() {
                                public void setParameters(Person element, PreparedStatement query)
                                        throws SQLException {
                                    PersonType dto = new PersonType();
                                    dto.first = element.first;
                                    dto.second = element.second;
                                    dto.is_real = element.is_real;
                                    query.setObject(1, dto);
                                }
                            })
                    );

不幸的是,这给了我一个例外:

java.lang.RuntimeException: org.postgresql.util.PSQLException: Can't infer the SQL type to use for an instance of dto.PersonType. Use setObject() with an explicit Types value to specify the type to use.

任何帮助都会很棒。

【问题讨论】:

    标签: java postgresql jdbc apache-beam jdbc-postgres


    【解决方案1】:

    所以,这是关于使用 PGobject()。这就是我实现它的方式,它似乎工作得很好。

     PGobject person = new PGobject();
     person.setType("person_type");
     person.setValue(String.format("(%s,%s,%s)","something","something","FALSE"));
     query.setObject(1, person);
    

    【讨论】:

      猜你喜欢
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-06
      • 2015-04-11
      • 1970-01-01
      • 2011-05-05
      • 1970-01-01
      相关资源
      最近更新 更多