Этот пример демонстрирует функцию, возвращающую список значений результата.
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 ArrayListdata; 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 - это целочисленная переменная, обозначающая состояние процесса выполнения функции. Поддерживаются три возможных значения: