Во всех примерах будем использовать отдельный подкаталог с именем myroot. Прежде всего следует этот подкаталог создать - например, так:
cd mkdir myroot cd myroot export MYROOT=`pwd`
Полное имя этого подкаталога будем в дальнейшем обозначать как $MYROOT. Если какая-то последовательность операций должна выполняться в определенном каталоге, это всегда указано явно (комадой cd в начале последовательности)
Создаем класс 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. Имя нужно знать при регистрации архива.
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 передаются три параметра:
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-файле нет ни одной зарегистрированной функции.
Разрегистрация функции:
dbaccess имя-базы <<EOF drop function getMyConstant(); EOF
После разрегистрации всех функций можно разрегистрировать jar-файл по его ранее назначенному идентификатору:
dbaccess имя-базы <<EOF EXECUTE PROCEDURE sqlj.remove_jar("lib1", 0); EOF