JOOQ: Как создать MockResult для хранимой процедуры без параметров? - PullRequest
1 голос
/ 20 марта 2020

При использовании MockDataProvider JOOQ, как правильно построить MockResult для хранимых процедур?

Приведенные мной примеры показывают, как вернуть результаты для таблиц и представлений, создав результат и запись из созданных определений таблиц, а затем вернув их. Для хранимых процедур я не уверен, как построить Результат.

Как создать запись, которая будет сопоставлена ​​с параметром возврата и параметрами хранимой процедуры?

Есть ли некоторые способ преобразования выходных параметров в подпрограмме для записи полей?

Вот пример хранимой процедуры, для которой я хотел бы создать результаты:

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

1 Ответ

1 голос
/ 23 марта 2020

Из MockDataProvider.execute Javado c:

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 не имеют отношения к MockDataProvider SPI в jOOQ. В вашем случае вам понадобятся дополнительные результаты после параметров out, которые вы можете просто добавить в массив MockResult[]. Важно то, что запись OUT возвращается первой.

...