Java UDF w DB2
Zaawansowane serwery baz danych umożliwiają użytkownikom rozszerzanie dostępnej logiki (User-defined routines) nie tylko w postaci podprogramów napisanych w SQL ale także w innych językach programowania. IBM DB2 umożliwia tworzenie podprogramów w PL/SQL lub w postaci zewnętrznych podprogramów w różnych językach w tym w Javie. Może się to okazać przydatne na przykład gdy chcemy użyć bibliotek niedostępnych z poziomu PL/SQL. Tak było w moim przypadku - potrzebowałem specyficznych algorytmów kryptograficznych.
Zdecydowałem się na stworzenie funkcji użytkownika w Javie (User Defined Functions). W tym poście pokażę jak stworzyć funkcję UDF używając rekomendowanego sposobu przekazywania parametrów PARAMETER STYLE JAVA. Korzystałem z serwera DB2 9.1 zainstalowanego na systemie AIX 5.3. Dla uproszczenia będzie to prosta funkcja dodająca suffix do ciągu znaków będącego argumentem. Jej implementacja w Javie jest trywialna:
public class UdfZ { public static String myFunction(String in) { return in + "_mySuffix"; } }
Po umieszczeniu jej w pliku UdfZ.java i skompilowaniu go javac UdfZ.java uzyskany plik UdfZ.class umieściłem w podkatalogu sqllib/function/ w katalogu domowym użytkownika będącego właścicielem instancji (w moim przypadku /home/db2inst/sqllib/function/). W tym katalogu można też umieszczać potrzebne pliki JAR.
Utworzyłem skrypt CreateUDFz.db2 tworzący funkcję użytkownika w DB2:
CREATE FUNCTION myFunction(VARCHAR(100)) RETURNS VARCHAR(100) EXTERNAL NAME 'UdfZ!myFunction' LANGUAGE JAVA PARAMETER STYLE JAVA NOT VARIANT FENCED CALLED ON NULL INPUT NO SQL NO EXTERNAL ACTION@
Gdzie EXTERNAL NAME 'UdfZ!myFunction' wskazuje na metodę myFunction klasy UdfZ. Po połączeniu się do bazy (db2 connect to DATABASENAME gdzie DATABASENAME jest nazwą bazy) uruchomiłem skrypt:
db2 -td@ -vf CreateUDFz.db2
Wykonanie operacji zostało potwierdzone komunikatem:
DB20000I The SQL command completed successfully.
Teraz można już wywołać stworzoną funkcję. Na przykład:
db2 "select myFunction('test') from sysibm.sysdummy1"
Otrzymany wynik świadczy o prawidłowym działaniu:
1
----------------------------------
test_mySuffix
1 record(s) selected.
W przypadku modyfikacji implementacji w Javie należy poinformować o tym DB2:
db2 "CALL SQLJ.REFRESH_CLASSES()"
Należy zaznaczyć, że jest to najprostszy przykład z możliwych. DB2 dostarcza wielu zaawansowanych możliwości związanych z implementacją podprogramów w Javie. Więcej informacji można znaleźć w rozdziale “Java routines” dokumentu “Developing User-defined Routines (SQL and External)”, który można ściągnąć ze strony z manualami dla DB2.
Komentarze
Chcesz coś napisać?