如何使用mybatis输入动态table在PostgreSQL中运行?

How to input dynamic table to function in PostgreSQL using mybatis?

我实现了一个将 table 名称、列名和列 ID 作为参数的 Postgres 函数。

它是动态的,因为结果会根据 table 名称而变化。

在 sql 中测试时效果很好。

postgresql 函数

create or replace function test(layer_name anyelement, field_name text, object_id text)
   returns setof anyelement
   language plpgsql
as $function$
   begin 
       return query execute format('
           select 
            *
           from
            %s
           where
            %s = cast( as int4)'
           , pg_typeof(layer_name), field_name)
           using object_id;
   end;
$function$
;

通话

select * from test(null::table_name,'field_name','2');

但是我用mybatis调用函数,没有收到结果就失败了

<select id="test" parameterType="map" resultType="map">
    select * from test(null::#{layer_name}, #{field_name}, #{object_id})
</select>

<select id="test" parameterType="map" resultType="map">
    select * from test(cast(null as #{layer_name}), #{field_name}, #{object_id})
</select>

我错过了什么,我需要做什么才能让它发挥作用?

错误代码 1

### The error occurred while setting parameters
### SQL: select * from test(null::?, ?, ?)
### Cause: org.postgresql.util.PSQLException: ERROR: syntax error at or near ""

错误代码 2

### The error occurred while setting parameters
### SQL: select * from test(cast(null as ?), ?, ?)
### Cause: org.postgresql.util.PSQLException: ERROR: syntax error at or near ""

对于 table 名称,您需要使用文本替换 ${} 而不是占位符 #{}
详情请看这个FAQ entry

<select id="test" resultType="map">
  select * from test(null::${layer_name}, #{field_name}, #{object_id})
</select>

这是一个执行程序table demo.