Как написать mybatis mapper для этой вставки во временную таблицу, созданную между ними?

Я пытаюсь написать mapper, используя аннотацию mybatis для следующего экстракта sql:

CREATE TEMP TABLE XYZ
.
/* Something */
.


CREATE TEMP TABLE ABC
as
Select ptype,pvalue,id,djob
from XYZ
where  pvalue> 0 
and CASE WHEN djob = ptype
then pvalue = d_job_partition_value END;

Insert into ABC
Select ptype,pvalue,id,djob
from XYZ
where 
CASE WHEN ptype = 'region' AND d_job_partition_type = 'region' 
THEN pvalue in (Select distinct CAST(region_id as NUMERIC(38,0)) from {db}.{table} where region_id=d_job_partition_value) END;

Класс картографа, который я пытался написать, имея в виду, что ABC это временная таблица, созданная между ними.

@Select("with XYZ as 
         (
         /* Something */
         ),
         ABC as (
         Select ptype,pvalue,id,djob
         from XYZ
         where  pvalue> 0 
         and CASE WHEN djob = ptype
         then pvalue = d_job_partition_value END),

         insert into ABC
         (ptype,pvalue,id,djob) values(
           Select ptype,pavalue,id,djob
           from XYZ
           CASE WHEN ptype = 'region' AND d_job_partition_type = 'region' 
           THEN pvalue in (Select distinct CAST(region_id as NUMERIC(38,0)) from {db}.{table} 
            where region_id=d_job_partition_value) END ")

Ошибка:

ERROR: syntax error at or near "into"
    [junit]   Position: 5828
    [junit]     at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
    [junit]     at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:107)
    [junit]     at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:98)
    [junit]     at org.apache.ibatis.session.SqlSessionManager$SqlSessionInterceptor.invoke(SqlSessionManager.java:282)
    [junit]     at com.sun.proxy.$Proxy28.selectList(Unknown Source)
    [junit]     at org.apache.ibatis.session.SqlSessionManager.selectList(SqlSessionManager.java:171)
    [junit]     at org.apache.ibatis.binding.MapperMethod.executeForMany(MapperMethod.java:114)
    [junit]     at org.apache.ibatis.binding.MapperMethod.execute(MapperMethod.java:58)
    [junit]     at org.apache.ibatis.binding.MapperProxy.invoke(MapperProxy.java:43)
    [junit]     at com.sun.proxy.$Proxy29.okey(Unknown Source)

Я знаю что @Insertиспользуется для вставки значений. Но в этом случае создание временной таблицы создает проблему.

Заранее спасибо.

1 ответ

Вы можете указать несколько операторов (включая создание временной таблицы) в @Insert аннотация к методу картографа:

@Insert(
  "create temp table xyz as select * from whatever; " +
  "CREATE TEMP TABLE ABC as Select ptype,pvalue,id,djob from XYZ;" +
  "Insert into ABC Select ptype,pvalue,id,djob from XYZ;"
)
void insertMultiple();

Это решение работает не только в postgres. Я проверял, он работает и с H2.

Обратите внимание, что вариант, который вы пробуете, а именно CTE akawith-query не создает временную таблицу.

Они выглядят как временная таблица, и даже в документации говорится, что они can be thought of as defining temporary tables that exist just for one queryно это только для пояснительных целей. Это не временные таблицы, и важным отличием является то, что в эти вспомогательные операторы невозможно выполнить вставку.

Другие вопросы по тегам