Hallo,
bekomme meine erste eigene Java-Function nicht ans Laufen.
Habe auf meinem PostgreSQL 8.3 Server plJava installiert und auch die mitgelieferten examples erfolgreich ausführen können, d.h.
nach der erforderlichen Installation der benötigten Komponenten und Defintion der Funktion
bringt der BefehlCode:CREATE FUNCTION getsysprop(VARCHAR) RETURNS VARCHAR AS $body$ java.lang.System.getProperty $body$ LANGUAGE java;das erwartete Ergebnis:Code:SELECT getsysprop('user.home');Nun zu meiner ersten eigenen Jave-Function. Folgender Java source codeCode:/var/lib/postgresql
wurde mitCode:package allDatabasesPk; import java.sql.*; public class Functions { public static String CURRENT_USERNAME( String vcLogin ) throws SQLException { String vcUserName = "Hill, Thomas"; return vcUserName; } }übersetzt und die entstandene Functions.class mittelCode:javac Functions.javain eine JAR common.jar gepackt.Code:jar -cf common.jar *.class
Und das JAR file in die DB geladen:
Mittels pgadmin wurde überprüft, dass die Funktion "CURRENT_USERNAME" im Schema javatest auch existert. Show class_path zeigt, dass javatest auch im Suchpfad ist.Code:SELECT sqlj.install_jar('file:///var/lib/tomcat5.5/webapps/postgreSQL/WEB-INF/lib/common.jar', 'common', false); SELECT sqlj.set_classpath('javatest', 'common');
Mit folgendem Befehl wurde dann die Funktion definiert:
Leider führtCode:CREATE OR REPLACE FUNCTION javatest."CURRENT_USERNAME"(VARCHAR) RETURNS VARCHAR AS 'allDatabasesPk.Functions.CURRENT_USERNAME' LANGUAGE java;aber immer zu dem ErgebnisCode:SELECT javatest."CURRENT_USERNAME"('xxx');
Habe schon alle möglichen Varianten im Create Function Statement ausprobiert (z.B. RETURNS varchar AS 'allDatabasePk.Functions.CURRENT_USERNAME()' oder auchCode:ERROR: java.lang.ClassNotFoundException: allDatabasesPk.Functions ********** Fehler ********** ERROR: java.lang.ClassNotFoundException: allDatabasesPk.Functions SQL Status:XX000
'allDatabasePk.Functions.CURRENT_USERNAME(java.lan g.String)' oder auch
javatest weggelassen), was alles leider nicht zum gewünschten Erfolg geführt hat.
Danke für die Hilfe.
Hallo,
habe die Lösung gefunden.
Anstelle von
im Verzeichnis allDatabasesPk abzusetzenCode:jar -cf common.jar *.class
muss man ein Verzeichnis höher
zur Erzeugung des JAR Files verwenden.Code:jar -cf common.jar allDatabasesPk/*.class
Ich habe irgendwie noch niemanden gefunden, der plJava ernsthaft einsetzt. Selbst die Firmen, die clientseitig mit Java arbeiten und sich das angeschaut haben, fanden das Handling zu kompliziert.
Aber Danke, dass du die Problemlösung hier auch veröffentlicht hast, vielleicht hilft das jemandem anderes mal weiter.
Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören
Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler
PostgreSQL Service & Support
Die Lösung hat jetzt nicht direkt was mit PL/Java zu tun.
Das sind die ganz "normalen" Regeln bzgl. Package-Struktur und Erzeugung einer jar-Datei
Das Programm hätte auch ausserhalb von PL/Java nicht funktioniert, wenn die jar Datei so gebaut wird.
Links: Tobias Bauer - IT- und Funkdienstleistungen - Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen - Funkforum
Lesezeichen