Hallo zusammen,
ich möchte gerne eine Java Stored Procedure aufrufen, erhalte aber immer die Fehlermeldung:
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.Code: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 Java-Programm beinhaltet:
Die Procedure habe ich mithilfe des iSeriesNavigator registriert, der automatisch erstellte SQL-Code lautet:Code: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); } }
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.Code: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 ;
Ü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:
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....").Code: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'
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?
![[NEWSboard IBMi Forum]](images/duke/nblogo.gif)

Mit Zitat antworten
Bookmarks