Vert.x и Oracle Database - как мне вызвать функцию, которая возвращает таблицу целых чисел? - PullRequest
0 голосов
/ 18 сентября 2018

Я пытаюсь вызвать хранимую функцию, которая возвращает таблицу целых чисел.Я пытаюсь использовать следующий запрос: { call ? := SOME_PACKAGE.get_some_ids(?, ?, ?, ?, ?, ?) }

Для вызова функции, которая выглядит следующим образом: FUNCTION get_some_ids(one IN INTEGER, two IN INTEGER, three IN INTEGER, four IN INTEGER, five IN INTEGER, six OUT INTEGER) RETURN int_tab;

И я готовлю этот вызов так:

conn.callWithParams(QUERY_GET_CONTRACTS,
    new JsonArray()
        .addNull()
        .add(10).add(10).add(10).add(10).add(10),
    new JsonArray()
        .add(OracleTypes.ARRAY)
        .addNull().addNull().addNull().addNull().addNull()
        .add("INTEGER"),

Такой подход прекрасно работает, когда я вызываю функцию, которая возвращает курсор ref (конечно, вместо этого я использовал OracleTypes.CURSOR).Код приводит к следующему исключению: java.sql.SQLException: Fail to construct descriptor: empty Object name

Давайте предположим, что я ничего не могу изменить в базе данных.Я попробовал некоторые приемы с использованием конструкций begin end, но с треском провалился.Любые подсказки будут с благодарностью, спасибо!

1 Ответ

0 голосов
/ 19 сентября 2018

Насколько я понимаю, это невозможно с готовыми API-интерфейсами vertx. Чтобы достичь того, что мне было нужно, мне пришлось создать новые классы, такие как JDBCClientImpl и JDBCConnectionImpl. Клиентский метод getConnection () порождает мой пользовательский JDBCConnectionImpl, и это соединение предоставляет открытый метод unwrap (), так что я могу делать обычный JDBC. В конце концов, я могу использовать это так:

CallableStatement callable = ((OJDBCConnectionImpl)conn).unwrap().prepareCall("my call");
callable.registerOutParameter(1, OracleTypes.ARRAY, "INT_TAB");

Это не идеально, но работает, если у вас нет выбора. Я думаю, что они должны предоставить способ для регистрации параметров так, как мы можем вручную, но нет удобного способа сделать это через JSON-зависимый API.

...