Обрабатывать хранимую процедуру так, как если бы это был оператор SELECT, который вернул значения.
В таких языках, как ESQL / C, вы подготавливаете оператор EXECUTE PROCEDURE, затем объявляете для него курсор, затем OPEN, FETCH в цикле и CLOSE. Аналогичные операции должны работать и в JDBC, и в Java - с той разницей, что вам может не потребоваться разделять фазы подготовки и выполнения.
Я могу написать «Java» - давайте подумаем; это начинается с 'C' ... не так ли? Как 'C'?
В ESQL / C вы должны написать (игнорируя проверку ошибок и объявления переменных):
EXEC SQL PREPARE prep_stmt FROM "EXECUTE PROCEDURE CursoryProcedure(?,?,?)";
EXEC SQL DECLARE cursor_nm FROM prep_stmt;
EXEC SQL OPEN cursor_nm USING :hostvar1, :hostvar2, :hostvar3;
while (SQLCODE == 0)
{
EXEC SQL FETCH cursor_nm INTO :receiver1, :receiver2, :receiver3,
:receiver4, :receiver5, :receiver6;
if (SQLCODE != 0)
break;
...use the values in the receiverN variables...
}
EXEC SQL CLOSE cursor_nm;
EXEC SQL FREE cursor_nm;
EXEC SQL FREE prep_stmt;
Три вопросительных знака-заполнителя представляют входные значения, переданные в хранимую процедуру; значения передаются ему в операции OPEN. Хранимая процедура может возвратить (ноль или) одну или несколько строк данных; каждая строка обрабатывается по очереди, как показано.
Единственная разница между этим кодом и обработкой оператора SELECT заключается в строке PREPARE:
select_str = "SELECT * FROM A_Table WHERE Col1 = ? AND (Col2 = ? OR Col3 < ?)";
EXEC SQL PREPARE prep_stmt FROM :select_str;
Теперь - вам нужно разобраться, как перевести приведенный выше ESQL / C в JDBC. Вам, вероятно, не нужно сильно беспокоиться о БЕСПЛАТНЫХ операциях - даже в ESQL / C даже одна из этих двух может быть избыточной (но безвредной). Но последовательность PREPARE, DECLARE, OPEN, FETCH-in-a-loop и CLOSE должна быть реплицирована.
Я предполагаю, что вы можете прочитать руководство и узнать, как написать хранимую процедуру Informix, но на всякий случай:
CREATE PROCEDURE CursoryProcedure(i INTEGER, j CHAR(10), k DATE)
RETURNING CHAR(20) AS v1, INTEGER AS v2, DATE AS v3,
VARCHAR(255) AS v4, INTEGER AS v5, INTEGER AS v6;
DEFINE v1 CHAR(20);
DEFINE v2 INTEGER;
DEFINE v3 DATE;
DEFINE v4 VARCHAR(255);
DEFINE v5 INTEGER;
DEFINE v6 INTEGER;
FOREACH SELECT *
INTO v1, v2, v3, v4, v5, v6
FROM Table
WHERE Col1 = i AND (Col2 = j OR Col3 < k)
RETURN v1, v2, v3, v4, v5, v6 WITH RESUME;
END FOREACH;
END PROCEDURE;
Это более или менее минимальная процедура, которая выполняет эту работу - вы не часто пишете процедуру, которая просто возвращает выбранные значения, не делая что-то большее с данными.