将 EnumType 传递给 Postgres 函数

Posted

技术标签:

【中文标题】将 EnumType 传递给 Postgres 函数【英文标题】:Pass EnumType to Postgres Function 【发布时间】: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 作为参数?

【问题讨论】:

【参考方案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)

以上是关于将 EnumType 传递给 Postgres 函数的主要内容,如果未能解决你的问题,请参考以下文章

将数组从 node-postgres 传递给 plpgsql 函数

在传递给Postgres之前使用Postgres默认值或生成它们是更好的做法吗?

给定传递给它的参数类型,如何确定函数参数的类型?

Postgres:将自定义类型从 Java 传递给 postgres 函数

使用来自 Nodejs Postgres 查询的数据 [重复]

将多维数组传递给函数 C