Функция с выполнением запроса SQL

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

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

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

	package ru.spb.whitepages.udr;

	import java.sql.Connection;
	import java.sql.DriverManager;
	import java.sql.PreparedStatement;
	import java.sql.ResultSet;
	import java.sql.SQLException;

	public class Resint {

	    public static Integer getIntResult(String argument) {

            Integer result = null;

	        try {
	            Class.forName("com.informix.jdbc.IfxDriver");

	            Connection connection = DriverManager.getConnection("jdbc:informix-direct:");

	            PreparedStatement statement =
		            connection.prepareStatement("select count(*) from systables where tabname like ?");

	            statement.setString(1, argument);

	            ResultSet resultSet = statement.executeQuery();

	            while (resultSet.next()) {
	                result = resultSet.getInt(1);
	            }

	            resultSet.close();

	            return result;

	        } catch (ClassNotFoundException | SQLException ex) {
	            System.out.println("Error: " + ex.getMessage());
	        }
	        return -1;
	    }
	}
  1. Прежде всего загружается класс JDBC-драйвера Informix, если этот класс еще не загружен. Загружаемый экземпляр класса драйвера относится к виртуальному процессору Java в экземпляре сервера Informix. Если в сервере сконфигурировано несколько таких виртуальных процессоров, Informix создаст несколько экземпляров драйвера.
  2. Далее функция устанавливает отдельное соединение с сервером. Подключение производится по протоколу informix-direct, так что по сути дела создается полная копия уже существующего соединения. Указывать обычные параметры URI (такие, как хост, номер порта, имя базы, параметры и прочее) не нужно.
  3. Транслируется параметризованный запрос, вычисляющий количество таблиц, имена которых соответствуют шаблону LIKE, после чего задается значение единственного параметра.
  4. Транслированный запрос выполняется. Запрос SELECT возвращает выборку (в данном случае из одной строки). При просмотре выборки полученная строка результата записывается в локальную переменную.
  5. Выборка и сам запрос закрываются.
  6. Функция возвращает полученный результат.

Компиляция и сборка

	cd $MYROOT
	rm -r *.class *.jar

	javac -source 1.7 -target 1.7 \
		-cp $INFORMIXDIR/extend/krakatoa/krakatoa.jar:$INFORMIXDIR/extend/krakatoa/jdbc.jar \
		ru/spb/whitepages/udr/Resint.java

	jar cvf iudr2.jar ru

Регистрация jar-файла и функции

	cd $MYROOT
	PWD=`pwd`
	dbaccess имя-базы <<EOF
	EXECUTE PROCEDURE sqlj.install_jar("file:$PWD/iudr2.jar", "lib2", 0);
	create function getIntResult(varchar(255)) returns int
		external name 'lib2:ru.spb.whitepages.udr.Resint.getIntResult(java.lang.String)'
	        language java;
	grant execute on function getIntResult(varchar) to public as informix;
	EOF

В данном случае имя метода в классе Java и имя функции в базе данных совпадают.

При задании внешнего имени функции и использовании строковых параметров функции необходимо указывать полное имя класса String - java.lang.String

Тестирование

	dbaccess имя-базы <<EOF
	EXECUTE FUNCTION getIntResult('sys%');
	EOF

		68

В базе найдено 68 таблиц, имена которых начинаются с текста 'sys'.

Удаление функции и jar-файла

	dbaccess имя-базы <<EOF
	drop function getIntResult(varchar);
	EXECUTE PROCEDURE sqlj.remove_jar("lib2", 0);
	EOF