Как я должен вызвать следующую хранимую процедуру (sql server 2008 r2) при весенней загрузке, mybatis с аннотацией

declare @p1 TbType_Order
insert into @p1 values('00005',20.01)
insert into @p1 values('00006',15.99)
exec Gp_UpdateOrderBillDT @tb=@p1,@intFlag=0,@billNumberId=16,@billType=301

«TbType_Order» является определяемым пользователем типом таблицы

CREATE TYPE [dbo].[TbType_Order] AS TABLE(
    [No] [varchar](50) NULL,
    [Price] [numeric](24, 10) NULL
)
GO

Я пытаюсь позвонить, используя этот способ:

public interface BillProcedureMapper {
    @Select({
        "<script>" + 
        " declare @p1 TbType_Order " +
        " <foreach item=\"item\" collection=\"details\"> ",
        " insert into @p1 values( #{item.no},#{item.price} )" +
        " </foreach> ",
        " exec Gp_UpdateOrderBillDT " +
            "@tb=@p1," +
            "@intFlag=0," +
            "@billNumberId=#{billNumberId}," +
            "@billType=301; " + 
        "</script>"
    })
    @Options(statementType = StatementType.CALLABLE)
    void savePurchaseOrderDetail(
        @Param("billNumberId") Long billNumberId,
        @Param("details") List<DetailDTO> details
    );
}

но jdbc говорит "переменная @ p1 уже объявлена", и я пытаюсь использовать обработчик типа:

public class TableTypeOrderHandler extends BaseTypeHandler {
    @Override
    public void setNonNullParameter(
        PreparedStatement ps, int i, Object parameter, JdbcType jdbcType
    ) throws SQLException {

        SQLServerDataTable sourceDataTable = new SQLServerDataTable();

        sourceDataTable.addColumnMetadata("No", Types.VARCHAR);

        sourceDataTable.addColumnMetadata("Price", Types.DECIMAL);

        List<DetailDTO> dataList = (List<DetailDTO>) parameter;

        for (DetailDTO o : dataList) {

            sourceDataTable.addRow(
                o.getNo(),
                o.getPrice()
            );

        }

        ps.setObject(i, sourceDataTable);
    }

    @Override
    public Object getNullableResult(ResultSet rs, String columnName) throws SQLException {
        return null;
    }

    @Override
    public Object getNullableResult(ResultSet rs, int columnIndex) throws SQLException {
        return null;
    }

    @Override
    public Object getNullableResult(CallableStatement cs, int columnIndex) throws SQLException {
        return null;
    }
}

затем измените метод выбора:

@Select({
    "exec Gp_UpdateOrderBillDT " +
            "@tb=#{details, jdbcType=VARCHAR, typeHandler=com.xxx.TableTypeOrderHandler}," +
            "@intFlag=0," +
            "@billNumberId=#{billNumberId}," +
            "@billType=301; "
})
@Options(statementType = StatementType.CALLABLE)
void savePurchaseOrderDetail(
    @Param("billNumberId") Integer billNumberId,
    @Param("details") List<DetailDTO> details
);

но исключение jdbc: конфликт типов операндов: тип таблицы несовместим с int

Что я должен сделать, чтобы сделать это правильно?

0
Ricky