将 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 函数