【问题标题】:JOOQ: How to create MockResult for stored procedure with out parameters?JOOQ:如何为没有参数的存储过程创建 MockResult?
【发布时间】:2020-07-01 22:47:07
【问题描述】:

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

我发现的示例显示了如何通过从生成的表定义创建结果和记录然后返回它们来返回表和视图的结果。对于存储过程,我不确定如何构建 Result。

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

有没有办法将例程上的输出参数转换为记录字段?

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

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

【问题讨论】:

    标签: java sql mocking jooq


    【解决方案1】:

    来自MockDataProvider.executeJavadoc:

    来自存储过程的OUT 参数是从第一个MockResult 的第一个Record 生成的。如果请求OUT 参数,实现者必须确保存在这样的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记录。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-05-25
      • 1970-01-01
      • 2011-05-11
      相关资源
      最近更新 更多