JOOQ:如何为没有参数的存储过程创建 MockResult?

JOOQ: How to create MockResult for stored procedure with out parameters?

使用 JOOQ MockDataProvider 时,为存储过程构建 MockResult 的正确方法是什么?

我找到的示例展示了如何通过从生成的 table 定义创建结果和记录,然后 return 来 return table 和视图的结果荷兰国际集团他们。对于存储过程,我不确定如何构建结果。

如何创建将映射到存储过程的 return 参数和输出参数的记录?

有什么方法可以将例程中的输出参数转换为记录字段吗?

这是一个示例存储过程,我想为其创建结果:

DECLARE @return_value int,
        @StoredSystemId int

EXEC    @return_value = [dbo].[myProc]
        @StoredSystemId = @StoredSystemId OUTPUT,
        @UserName = 'user',
        @EmailAddress = 'user@mail.com'

SELECT  @StoredSystemId as N'@StoredSystemId'

SELECT  'Return Value' = @return_value

来自 MockDataProvider.execute Javadoc:

OUT parameters from stored procedures are generated from the first MockResult's first Record. If OUT parameters are requested, implementors must ensure the presence of such a Record.

例如:

MockConnection con = new MockConnection(ctx -> {
    Field<Integer> id = DSL.field("StoredSystemId", SQLDataType.INTEGER);
    return new MockResult[] { new MockResult(DSL.using(DEFAULT).newRecord(id).values(42)) };
});

try (CallableStatement cstmt = con.prepareCall("{ call xyz(?) }")) {
    cstmt.registerOutParameter(1, Types.INTEGER);
    cstmt.execute();

    System.out.println(cstmt.getInt(1));
}

它将打印:

42

请注意,字段名称和实际 SQL 字符串都与 jOOQ 的 MockDataProvider SPI 无关。在您的情况下,您需要在 out 参数之后获得额外的结果,您可以将其附加到 MockResult[] 数组。重要的是先返回OUT记录。