Guten Tag,
ich hoffe mir kann jemand hier weiterhelfen. Ich stehe vor dem Problem, dass ich einem Java-Programm aus einer SQL-Anweisung per User-Defined-Function (RPGLE) zugreifen möchte.
Code:
String sql = "SELECT feld1, feld2, pgm.fu132t(feld1, feld2) AS teststring
FROM dateia1 WHERE feld1 = '100' AND feld2 = 550";
Das ganze läuft auf einem (WebSphere) Application-Server mit dem XA-Treiber (com.ibm.as400.access.AS400JDBCXADataSource) aus der JT400 Toolbox.
Beim Ersten Aufruf funktioniert alles ganz wunderbar. Ich erhalte z.B. die Ausgabe: "100:550:Test100"
Wenn ich allerdings den Test wiederhole bekomme ich die Ausgabe "null:null:null" und folgenden Fehler auf die Java-Konsole:
Code:
SystemOut O java.sql.SQLException: [SQL0443] *N Ursache . . . . :
Von einem Auslöserprogramm, einer externen Prozedur oder einer
externen Funktion wurde ein Fehler erkannt und an SQL zurückgegeben.
Ist der Fehler in einem Auslöserprogramm aufgetreten, war der Auslöser
in Tabelle FU132T in Schema PGM. Ist der Fehler in einer externen
Prozedur oder Funktion aufgetreten, lautet der externe Name FU132T in
Schema PGM. Der zugeordnete Text ist *N. Trat der Fehler in einem
Auslöserprogramm auf, ist der zugeordnete Text die Art des
Auslöserprogramms. Trat der Fehler in einer externen Prozedur oder
Funktion auf, ist der zugeordnete Text der Text der Fehlernachricht, die
von der externen Funktion zurückgegeben wurde. Fehlerbeseitigung:
Das Jobprotokoll enthält weitere Informationen über den erkannten
Fehler. Die Fehler berichtigen und die Anforderung wiederholen.
at com.ibm.as400.access.JDError.throwSQLException
--- gekürzt ---
Das RPGLE Routine sieht wie folgt aus:
Code:
* ************************************
* * SQL - User defined Procedure
* *
* ************************************
* 1) Module erstellen
* -------------------
* CRTRPGMOD MODULE(PGM/FU132T) SRCFILE(PGMSRC/QRPGLESRC)
* SRCMBR(FU132T) REPLACE(*YES) ALWNULL(*YES)
*
* 2) Service-Programm erstellen
* -----------------------------
* CRTSRVPGM SRVPGM(PGM/FU132T) EXPORT(*ALL)
* TEXT('Serviceprogramm fuer FU132T')
*
* 3) SQL Funktion erstellen
* -------------------------
* CREATE FUNCTION PGM/FU132T
* ( PARAM1 char(3),
* PARAM2 dec(4)
* ) RETURNS char(150)
* LANGUAGE RPGLE
* EXTERNAL NAME 'PGM/FU132T(SQL_FUNC)'
* DETERMINISTIC
* RETURNS NULL ON NULL INPUT
* NO SQL
* NO EXTERNAL ACTION
* PARAMETER STYLE SQL
* ALLOW PARALLEL
* NOT FENCED
* *****************************************
* * PROTOTYP
* * --------
* *****************************************
H* //Dieses Modul beinhaltet nur Subprozeduren
H Option(*noDebugIO : *noShowCpy)
H DECEDIT('0,') DATEDIT(*DMY.)
H NOMAIN
F* ----------------------------------------------------------
F* Dateien
F* ----------------------------------------------------------
FDATEIA1 IF E K DISK
D* ----------------------------------------------------------
D* Definition der Prototyp Felder für das Aufrufende Programm
D* ----------------------------------------------------------
DSQL_FUNC PR 150A
D #PARAM1 3
D #PARAM2 4 0
C* **********************************************************
C* * BEGINN der Prozedur
C* * -------------------
C* ***********************************************
C* //Prozedur aus dem Modul exportieren
PSQL_FUNC B EXPORT
C* -----------------------------------------------
C* Definitionen der Funktion
C* -----------------------------------------------
C* //Prozedur Schnittstelle definieren
DSQL_FUNC PI 150A
D #PARAM1 3
D #PARAM2 4 0
D*
C* //Initialisierung Work-Felder
D WRKSTR S 150 INZ(*BLANKS)
C* -----------------------------------------------
C* Key Felder
C* -----------------------------------------------
C KEY01 KLIST
C KFLD #PARAM1
C KFLD #PARAM2
C
C* -----------------------------------------------------
C* Verarbeitung Datensätze
C* -----------------------------------------------------
C KEY01 SETLL DATEIA1
C EVAL WRKSTR = 'TEST' + #PARAM1
C* //String zurückgeben
C RETURN WRKSTR
PSQL_FUNC E
Im Jobprotokoll finde ich noch folgende Hinweise mit denen ich allerdings nichts anfagen kann:
Code:
Job 432275/QUSER/QZDASOINIT im Subsystem QUSRWRK in QSYS am 26.02.11 um
22:04:05 gestartet. Job im System am 26.02.11 um 22:04:05. angekommen.
Benutzer MYUSER an Client xxx.xxx.xxx.xxx ist mit dem Server verbunden.
Cursor CRSR0001 nicht geöffnet.
Es wurde versucht, auf ein nicht mehr vorhandenes Objekt oder Teile des
Objekts Bezug zu nehmen.
Interner Fehler im Umwandlungsprogramm oder in einer Unterroutine.
Anwendungsfehler. RNX9998 nicht überwacht durch PCSSQ2 bei Anweisung *N,
Instruktion X'0000'.
Es wurde versucht, auf ein nicht mehr vorhandenes Objekt oder Teile des
Objekts Bezug zu nehmen.
Aufrufstapeleintrag nicht gefunden.
Ausnahmerekursion erkannt.
Anwendungsfehler. *N nicht überwacht durch *N bei Anweisung *N,
Instruktion X'4000'.
Fehler bei benutzerdefinierter Funktion in Teildatei DATEIA1.
Fehler bei benutzerdefinierter Funktion in Teildatei DATEIA1.
Fehler von Auslöserprogramm oder externer Routine erkannt.
Cursor CRSR0001 nicht geöffnet.
Es wäre schön wenn mir jemand Hinweise geben könnte wo sich der Fehler befinden könnte.
Andreas Tomik
Bookmarks