Возвращаемые значения хранимой процедуры Informix - PullRequest
1 голос
/ 28 января 2011

Мне нужно создать хранимую процедуру, которая возвращает оператор выбора, скажем, около 4-5 столбцов со значениями.

Мне нужно вызвать это из приложения Java, чтобы я не мог поместить вывод ввременная таблица, так как эта временная таблица не будет доступна из другого сеанса.Поэтому мне нужно вызвать хранимую процедуру, а затем создать список массивов из возвращаемых значений.

Возвращенные данные будут select * from table.

1 Ответ

0 голосов
/ 28 января 2011

Обрабатывать хранимую процедуру так, как если бы это был оператор 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;

Это более или менее минимальная процедура, которая выполняет эту работу - вы не часто пишете процедуру, которая просто возвращает выбранные значения, не делая что-то большее с данными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...