Получение списка значений

Этот пример демонстрирует функцию, возвращающую список значений результата.

Создание класса ColumnValues

package ru.spb.whitepages.udr;

import com.informix.udr.UDREnv;
import com.informix.udr.UDRManager;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;

public class ColumnValues {

    public ArrayList data;
    public int coffset;

    public static String colValues(java.lang.String tableName, java.lang.String columnName, int limit)
        throws SQLException, ClassNotFoundException {

        UDREnv udrenviron = UDRManager.getUDREnv();
        int iterStage = udrenviron.getSetIterationState();
        ColumnValues state = (ColumnValues) udrenviron.getUDRState();

        switch (iterStage) {
            case UDREnv.UDR_SET_INIT:
                state = new ColumnValues();
                state.data = new ArrayList<>();

                Class.forName("com.informix.jdbc.IfxDriver");
                Connection connection = DriverManager.getConnection("jdbc:informix-direct:");
                PreparedStatement statement = connection.prepareStatement(
                        "select first " + limit + " " + columnName + " from " + tableName);
                ResultSet resultSet = statement.executeQuery();
                while (resultSet.next()) {
                    state.data.add(resultSet.getString(1));
                }
                resultSet.close();

                state.coffset = -1;

                udrenviron.setUDRState(state);
                udrenviron.setSetIterationIsDone(false);

                return null;

            case UDREnv.UDR_SET_END:
                udrenviron.setSetIterationIsDone(true);
                return null;

            case UDREnv.UDR_SET_RETONE:
                state.coffset++;
                if (state.coffset >= state.data.size()) {
                    udrenviron.setSetIterationIsDone(true);
                    return null;
                }
                udrenviron.setSetIterationIsDone(false);
                return state.data.get(state.coffset);

            default:
                throw new SQLException("Bad iter code");
        }
    }

}

Классический метод Java может возвратить не более чем одно значение. Так как наш запрос может выдавать любое число значений, функцию придется вызвать как минимум соответствующее число раз, чтобы получить все значения результата - по одному. В реальности метод нашей функции будет вызван:

Метод UDRManager.getUDREnv() обычно выполняется в самом начале нашей функции. Он обеспечивает доступ к текущему состоянию функции. В примере для этого используется объект класса UDREnv с именем udrenviron; состояние этого объекта сохраняется между вызовами функции и удаляется только после того, как выполнение всей функции закончено.

Переменная с именем iterStage - это целочисленная переменная, обозначающая состояние процесса выполнения функции. Поддерживаются три возможных значения:

  1. UDREnv.UDR_SET_INIT - инициализация - выполняется один раз при начале выполнения функции
  2. UDREnv.UDR_SET_RETONE - получение очередного значения результата - будет выполнено столько раз, столько потребуется
  3. UDREnv.UDR_SET_END - завершение - выполняется один раз в конце выполнения функции