Простейшая функция

Простейшая функция возвращает константу.

Создание отдельного подкаталога для сборки

Во всех примерах будем использовать отдельный подкаталог с именем myroot. Прежде всего следует этот подкаталог создать - например, так:

	cd
	mkdir myroot
	cd myroot
	export MYROOT=`pwd`

Полное имя этого подкаталога будем в дальнейшем обозначать как $MYROOT. Если какая-то последовательность операций должна выполняться в определенном каталоге, это всегда указано явно (комадой cd в начале последовательности)

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

Создаем класс Constant в пакете ru.spb.whitepages.udr

Прежде всего создаем последовательность подкаталогов для пакета:

	cd $MYROOT
	mkdir -p ru/spb/whitepages/udr

, затем создаем в этом подкаталоге в файле Constant.java исходный текст класса:

	package ru.spb.whitepages.udr;

	public class Constant {

	    public static int getMyValue() {
	        return 234;
	    }
	}

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

	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/Constant.java

	jar cvf iudr1.jar ru

Опции -source и -target позволяют задать, какая именно версия java должна использоваться при компиляции и в дальнейшем при использовании функции. Версия java функции должна соответствовать версии java в расширении krakatoa.

Здесь выбрано имя jar-файла iudr1. Имя нужно знать при регистрации архива.

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

	cd $MYROOT
	PWD=`pwd`
	dbaccess имя-базы <<EOF
	EXECUTE PROCEDURE sqlj.install_jar("file:$PWD/iudr1.jar", "lib1", 0);
	EOF

Вызов процедуры install_jar загружает подготовленный jar-файл в имеющийся в СУБД smart blob. В install_jar передаются три параметра:

  1. URL загружаемого jar-файла - в данном случае загрузка идет из файловой системы (file), нужно указать полное имя jar-файла
  2. текстовый идентификатор архива - по этому идентификатору в дальнейшем можно будет удалить ранее загруженный jar-файл
  3. номер версии - обычно ноль

Регистрация функции

	dbaccess имя-базы <<EOF
	create function getMyConstant() returns int
		external name 'lib1:ru.spb.whitepages.udr.Constant.getMyValue()'
        language java;
	grant execute on function getMyConstant() to public as informix;
	EOF

Первый запрос - CREATE FUNCTION - регистрирует новую функцию с имемем getMyConstant, не требующую аргументов и возвращающую одно значение типа int. Внешнее имя содержит идентификатор архива, за которым следуют полное имя класса Java, имя вызываемого статического метода и список типов аргументов. Имя вызываемого метода никак не связано с именем регистрируемой функции.

Второй запрос - GRANT EXECUTE - устанавливает права на использование новой функции.

Оба запроса выполняются от имени пользователя informix (или от имени пользователя, обладающего правом EXTEND в используемой базе данных).

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

	dbaccess имя-базы <<EOF
	EXECUTE FUNCTION getMyConstant();
	EOF

		234

Так как ранее всем было разрешено использовать эту функцию, скрипт может выполнить любой пользователь, имеющий доступ к базе.

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

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

Удаление jar-файла возможно только в том случае, когда в этом jar-файле нет ни одной зарегистрированной функции.

Разрегистрация функции:

	dbaccess имя-базы <<EOF
	drop function getMyConstant();
	EOF

После разрегистрации всех функций можно разрегистрировать jar-файл по его ранее назначенному идентификатору:

	dbaccess имя-базы <<EOF
	EXECUTE PROCEDURE sqlj.remove_jar("lib1", 0);
	EOF