【问题标题】:Pass EnumType to Postgres Function将 EnumType 传递给 Postgres 函数
【发布时间】:2019-02-26 07:59:21
【问题描述】:

首先....我有一个这样的 postgres 函数:

CREATE OR REPLACE FUNCTION auth.MyFunction (
  platform autorizacion.e_tipo_plataforma, //Enum Type
  pAppId varchar,
  pVersion integer
)

e_tipo_plataforma 是:

CREATE TYPE autorizacion.e_tipo_plataforma AS ENUM (
'Web', 'Escritorio', 'Movil', 'Servicio');

您可以看到调用该函数的参数是Enum Type (e_tipo_plataforma)

我正在尝试将此 EnumType 发送到 Postgres CallableStatement

String query="{call auth.MyFunction(?,?,?)}";
CallableStatement ps=conn.prepareCall(funcionLlamar);

第一个意图:ps.setObject("p_tipo_plataforma", usuario.tipoPlataforma);

usuario.tipoPlataforma

错误:

java.sql.SQLFeatureNotSupportedException:方法 org.postgresql.jdbc.PgCallableStatement.setObject(String,Object) 是 尚未实施。

第二个意图:ps.setObject(1, usuario.tipoPlataforma.name());

错误:

function auth.MyFunction(字符变化,字符变化, 整数)不存在

更新: 第三个意图:ps.setObject(1, usuario.tipoPlataforma);

错误:

无法推断用于实例的 SQL 类型 enumerator.TipoPlataforma。使用 setObject() 使用明确的 Types 值来指定要使用的类型。

问题是,如果 postgres 中的函数只接受这种类型,如何发送 EnumType 作为参数?

【问题讨论】:

    标签: java postgresql enums enumerable


    【解决方案1】:

    您可以将枚举值作为字符串传递(当然,假设您的 Java 和 PostgreSQL 枚举的名称匹配!),并将字符串转换为枚举的繁重工作交给数据库:

    ps.setString("p_tipo_plataforma", usuario.tipoPlataforma.name());
    

    【讨论】:

    • 它通过了......但是执行时: ps.setString(2,usuario.identificadorAplicacion); ps.setInt(3,usuario.version);结果集 rs=ps.executeQuery();给我下一个错误:“错误:函数 auth.MyFunction(字符变化,字符变化,整数)不存在”............因为函数期望 EnumType 作为参数而不是字符跨度>
    • 创建另一个接受枚举字符串变体的函数。然后让该函数调用您的原始函数,将字符串转换为枚举auth.MyFunction (theEnumAsString::autorizacion.e_tipo_plataforma, pAppId, pVersion)
    猜你喜欢
    • 2012-10-30
    • 2012-08-16
    • 1970-01-01
    • 2019-08-05
    • 1970-01-01
    • 2020-07-28
    • 2015-03-05
    • 1970-01-01
    • 2012-08-14
    相关资源
    最近更新 更多