PDA

View Full Version : Java Stored Procedures



unbekannterheld
15-01-09, 09:30
Hallo zusammen,

ich möchte gerne eine Java Stored Procedure aufrufen, erhalte aber immer die Fehlermeldung:


SQL-Status: 42724
Vendorencode: -4304
Nachricht: [SQL4304] Die gesp. Java-Proz. oder benutzerdef. Funktion TESTJABBA mit dem spez. Namen TESTJABBA konnte Java-Klasse TestProcedure/TestProcedure wegen Ursachencode 1 nicht laden. Ursache . . . . : Die von der Klausel EXTERNAL NAME der Anweisung CREATE PROCEDURE oder CREATE FUNCTION vorgegebene Java-Klasse konnte nicht geladen werden. Ursachencodes und ihre Bedeutung: 1 -- Klasse wurde im CLASSPATH nicht gefunden. 2 -- Für die Klasse ist die erforderl. Schnittstelle nicht implementiert ("com.ibm.db2.app.StoredProc" or "com.ibm.db2.app.UDF") oder die Java-Markierung für "öffentlichen" Zugriff fehlt. 3 -- Standardkonstruktor fehlgeschlagen oder nicht verfügbar. Fehlerbeseitigung: Sicherstellen, dass die umgewandelte ".class"-Datei im CLASSPATH installiert wird, z. B. unter "/QIBM/UserData/OS400/SQLLib/Function". Sicherstellen, dass sie die erforderlichen Java-Schnittstellen implementiert und "öffentlich" ist.


Das entsprechende Java Programm liegt als .class-Datei im Verzeichnis "\QIBM\UserData\OS400\SQLLib\Function\TestProcedure" und wurde mit "CRTJVAPGM CLSF('/QIBM/UserData/OS400/SQLLib/Function/TestProcedure/TestProcedure.class') CLASSPATH(*envvar) OPTIMIZE(40) SUBTREE(*ALL)" auf der i5 erstellt.

Das Java-Programm beinhaltet:


package TestProcedure;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;
import com.ibm.db2.app.StoredProc;

public class TestProcedure extends StoredProc
{
public static void getUebkunnum(String firma, int inKunnum, ResultSet[] outKunde) throws Exception
{
String sql = "SELECT feld1, feld2, feld3 FROM LIB.TABELLE;

Connection con = DriverManager.getConnection("jdbc:default:connection");
Statement st = con.createStatement();
outKunde[0] = st.executeQuery(sql);
}
}


Die Procedure habe ich mithilfe des iSeriesNavigator registriert, der automatisch erstellte SQL-Code lautet:


CREATE PROCEDURE ASPROD.TESTJABBA (
IN INFIRMA VARCHAR(2) ,
IN INKUNNUM INTEGER )
DYNAMIC RESULT SETS 1
LANGUAGE JAVA
SPECIFIC ASPROD.TESTJABBA
NOT DETERMINISTIC
READS SQL DATA
CALLED ON NULL INPUT
EXTERNAL NAME 'TestProcedure.TestProcedure.getUebkunnum'
PARAMETER STYLE JAVA ;


Das ganze habe ich auch schon ohne das Unterverzeichnis "TestProcedure" in "\QIBM\UserData\OS400\SQLLib\Function" versucht (ich habe irgendwo gelesen, dass ein entsprechendes Unterverzeichnis für das Java-Paket vorhanden sein soll), erhalte dann aber dieselbe Fehlermeldung.

Über WRKENVVAR habe ich auf *SYS und *JOB - Ebene (aus purer Verzweiflung) sämtliche Verzeichnisse hinzugefügt, die ich in den unterschiedlichen Dokumentationen gefunden habe:



Umgebungsvariablen anzeigen (*JOB)

Name . . . . . . . . . : CLASSPATH


Wert . . . . . . . . . : '/QIBM/UserData/OS400/SQLLibFunction:/QIBM/ProdData/Java400/ext/db2routines_classes.jar:/qibm/ProdData/OS400/Java400/ext/runtime.zip:QIBM/UserData/OS400/SQLLib/FunctionTestProcedure/TestProcedure.class:/QIBM/ProdDataOs400/Java400/ext/sqlj_classes.jar:/QIBM/ProdDataOs400/Java400/ext/translator.zip'


Die eigentliche Java-Klasse wird anscheinend gefunden, da der erste Aufruf einer neu erstellten .class-Datei über "call asprod.testjabba ('Test',12345) immer etwas länger dauert. Wenn ich die .class-Datei umbenenne erhalte ich eine ganze andere Fehlermeldung ("Keine Berechtigung....").

Den Aufruf habe ich über den SQL-Client im iSeriesNavigator getestet aber auch aus einem Java-Programm mithilfe der CallableStatements-Klasse. Die Fehlermeldung ist bei beiden Varianten dieselbe.

Das ganze läuft auf auf V5R4 mit einem recht aktuellem PTF-Stand.

Was mache ich falsch, dass beim Aufruf der Procedure der oben genannte Fehler auftritt?