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.

Zacheusz Siedlecki

Komentarze

Chcesz coś napisać?





*