Anmelden

View Full Version : Java Stored Procedure



Seiten : [1] 2

HeisigA
17-02-05, 13:47
Hallo,
ich versuche eine Java Stored Procedure aufzurufen. Im ersten Schritt
habe ich ein kleines Java Programm erstellt.

public class JDummy {
public static void main(String[] args) {
System.out.println("... call method JDummy");
JDummy();
System.out.println("... back");
}
public static void JDummy() {
System.out.println("... inside method");
}
} Kompiliert und nach /QIBM/UserData/OS400/SQLLib/Function
kopiert. Die main-Methode und println sind einfach nur zum Testen.
Als nächstes registriere ich die Methode mit:

CREATE PROCEDURE JDummy()
LANGUAGE JAVA
PARAMETER STYLE JAVA
NOT FENCED
EXTERNAL NAME 'JDummy.JDummy'
Das ganze habe ich auch über iSeries Navigator probiert. Beim Aufruf
über Navigator oder mittels STRSQL call QGPL/jdummy() kriege ich
Fehlermeldungen meine EXTERNAL NAME Klausel stimmt nicht, aber was?.
Warum funktioniert das nicht? Die Vorgehensweise ist
aus dem redbook
'Stored Procedures, Triggers and User Defined Functions on DB2 Universal
Database for iSeries'
entlehnt.

Gruß Andreas

RobertPic
17-02-05, 15:54
Meiner Meinung nach müsste es

...


EXTERNAL NAME 'JDummy!main'</pre>
heißen, wo bei man das !main vielleicht weglassen kann.

Siehe auch:

http://publib.boulder.ibm.com/iseries/v5r2/ic2929/index.htm

LG
Robert P.

HeisigA
17-02-05, 16:15
Hallo RobertPic,
die main-methode habe ich implementiert um die kompilierte
Klasse auf der AS/400 zu testen. Dazu rufe ich einfach in
einer QSH-Sitzung 'java JDummy' auf.
Mit ... external name 'JDummy!main' habe ich es aber auch
probiert und es funzt nicht.
In allen Beispielen wird so vorgegangen, wie ich es beschrieben
habe. Irgendwo habe ich eine winzige Kleinigkeit übersehen,
aber wo???

Gruß Andreas


Meiner Meinung nach müsste es

...




EXTERNAL NAME 'JDummy!main'

</PRE>

heißen, wo bei man das !main vielleicht weglassen kann.

Siehe auch:

http://publib.boulder.ibm.com/iseries/v5r2/ic2929/index.htm

LG
Robert P.

BenderD
17-02-05, 19:05
Hallo,

es ist möglicherweise für den SQL Java Stub verwirrend, dass du die Methode mit dem Klassennamen identisch hast, das riecht nach Konstruktor, ist aber keiner; ich habe das allerdings noch nicht gemacht und rate auch davon ab.
Java stored Procedures führen dazu in jedem Serverjob, der sowas verwendet eine JVM zu starten und in jedem lokalen Job, der das mit COBOL/RPG via SQL verwendet ebenfalls. Da freut sich allenfalls IBM über die Hardware, die man dafür braucht, aber der Anwender ärgert sich, weil das trotzdem nicht brummt und der Programmierer ärgert sich, weil das nur fast funktioniert, zumindest, wenn man Voraussetzungen an die JVM hat.
Was soll die stored Procedure denn machen? da gibt es sicher was besseres1

mfg

Dieter Bender


Hallo,
ich versuche eine Java Stored Procedure aufzurufen. Im ersten Schritt
habe ich ein kleines Java Programm erstellt.

public class JDummy {
public static void main(String[] args) {
System.out.println("... call method JDummy");
JDummy();
System.out.println("... back");
}
public static void JDummy() {
System.out.println("... inside method");
}
} Kompiliert und nach /QIBM/UserData/OS400/SQLLib/Function
kopiert. Die main-Methode und println sind einfach nur zum Testen.
Als nächstes registriere ich die Methode mit:

CREATE PROCEDURE JDummy()
LANGUAGE JAVA
PARAMETER STYLE JAVA
NOT FENCED
EXTERNAL NAME 'JDummy.JDummy'
Das ganze habe ich auch über iSeries Navigator probiert. Beim Aufruf
über Navigator oder mittels STRSQL call QGPL/jdummy() kriege ich
Fehlermeldungen meine EXTERNAL NAME Klausel stimmt nicht, aber was?.
Warum funktioniert das nicht? Die Vorgehensweise ist
aus dem redbook
'Stored Procedures, Triggers and User Defined Functions on DB2 Universal
Database for iSeries'
entlehnt.

Gruß Andreas

Sven Schneider
17-02-05, 20:49
Was ich nicht verstehe ist der Aufruf :


....call QGPL/jdummy()

Also ich würde es mal mit :


call jdummy()

versuchen.

Im Prinzip hängt es aber davon ab wie bzw. wo (schema) die procedure registriert wurde :

Auszug aus dem Redbook :

Note: We do not qualify the stored procedure names with a library (schema) name. If the
current naming convention for the Run SQL Scripts session is *SQL, the stored procedures
are registered in the library with the same name as the current user profile for this session.
If the naming convention is *SYS, the stored procedures are registered in the current
library.

Also ich würde mal im Katalog SYSROUTINES nachschauen wie die Java Proc registriert ist.

Wenn nicht versuchs mal mit :

CREATE PROCEDURE JDummy()
LANGUAGE JAVA
PARAMETER STYLE JAVA
NOT FENCED
EXTERNAL NAME 'JDummy!JDummy'

HeisigA
21-02-05, 08:32
Hallo Sven,
war leider verhindert, deshalb verspätet die Antwort. Vorab möchte ich sagen,
dass ich Neuling bezüglich AS/400 DB2 bin. Die AS/400 Nomenklatur ist mir noch fremd.

Wenn ich im Navigator teste muss ich das/die Schema/Lib angeben. Die Procedure liegt laut SYSIBM.ROUTINES im "Specific_Schema" QGPL und "Routine_Schema" QGPL. Mit "call QGPL/routine()", dachte ich, kann ich im Navigator die Procedure aufrufen und testen. Der Tipp mit den SYSROUTINES war super. Nun kann ich ähnlich wie in Oracle meine Objekte angucken. Auf unser DB/2 heisst die Tabelle "SYSIBM.ROUTINES". Wird wahrscheinlich ab V8 so sein. Kannst du mir einen Auszug deiner "..ROUTINES" zukommen lassen, wo JAVA Procedures registriert sind und sich aufrufen lassen? Vielleicht erkennt man an den Spalten "External_Name;External Language" was bei mir schief läuft.

Gruß Andreas


Was ich nicht verstehe ist der Aufruf :



Also ich würde es mal mit :


call jdummy()

versuchen.

Im Prinzip hängt es aber davon ab wie bzw. wo (schema) die procedure registriert wurde :

Auszug aus dem Redbook :

Note: We do not qualify the stored procedure names with a library (schema) name. If the
current naming convention for the Run SQL Scripts session is *SQL, the stored procedures
are registered in the library with the same name as the current user profile for this session.
If the naming convention is *SYS, the stored procedures are registered in the current
library.

Also ich würde mal im Katalog SYSROUTINES nachschauen wie die Java Proc registriert ist.

Wenn nicht versuchs mal mit :

CREATE PROCEDURE JDummy()
LANGUAGE JAVA
PARAMETER STYLE JAVA
NOT FENCED
EXTERNAL NAME 'JDummy!JDummy'

HeisigA
21-02-05, 08:42
Hallo BenderD,

leider erst jetzt die Antwort, war vorübergehend verhindert. Ja, da gebe ich Dir recht. Nur ist mein Ehrgeiz furchtbar angestachelt eine Java-Stored-Procedure zum Laufen zu bringen. Ausgangspunkt war/ist, Altdatenübernahme und die Transformation dieser. Da ich sehr gute Java-Programmierer kenne und ich sagte, laut Doku laufen auch Java-Stored-Procedures auf unserem Server, bin ich einfach geneigt dieses auch zum Laufen zu bringen. Mit meiner geposteten Klasse war das Beispiel vielleicht unglücklich gewählt, ich habe auch das Ganze ohne konstruktorähnliche Methode ausprobiert. Ohne Erfolg.
Eine weitere Hilfestellung wäre nett.

Gruß Andreas


Hallo,

es ist möglicherweise für den SQL Java Stub verwirrend, dass du die Methode mit dem Klassennamen identisch hast, das riecht nach Konstruktor, ist aber keiner; ich habe das allerdings noch nicht gemacht und rate auch davon ab.
Java stored Procedures führen dazu in jedem Serverjob, der sowas verwendet eine JVM zu starten und in jedem lokalen Job, der das mit COBOL/RPG via SQL verwendet ebenfalls. Da freut sich allenfalls IBM über die Hardware, die man dafür braucht, aber der Anwender ärgert sich, weil das trotzdem nicht brummt und der Programmierer ärgert sich, weil das nur fast funktioniert, zumindest, wenn man Voraussetzungen an die JVM hat.
Was soll die stored Procedure denn machen? da gibt es sicher was besseres1

mfg

Dieter Bender

B.Hauser
21-02-05, 09:02
Hallo Andreas,

hast Du Dir schon mal die folgenden Redbooks angeschaut?
Vielleicht findet sich ja darin, was Du suchst:

1. DB2 Java Stored Procedures Learning by Example (http://www.redbooks.ibm.com/abstracts/sg245945.html?Open)
2. Stored Procedures, Triggers and User Defined Functions on DB2 Universal Database for iSeries (http://www.redbooks.ibm.com/abstracts/sg246503.html?Open)

Birgitta

HeisigA
21-02-05, 10:24
Hallo Birgitta,
danke für die Tipps.
1. arbeite ich gerade durch und aus 2. habe ich die Beispiele rausgezogen. In ".. Learning by Example" tue ich mir noch schwer, ob es 1 zu 1 übertragbar ist von OS/390 zu AS/400.

Gruß Andreas


Hallo Andreas,

hast Du Dir schon mal die folgenden Redbooks angeschaut?
Vielleicht findet sich ja darin, was Du suchst:

1. DB2 Java Stored Procedures Learning by Example (http://www.redbooks.ibm.com/abstracts/sg245945.html?Open)
2. Stored Procedures, Triggers and User Defined Functions on DB2 Universal Database for iSeries (http://www.redbooks.ibm.com/abstracts/sg246503.html?Open)

Birgitta

Sven Schneider
21-02-05, 15:37
Damit kompatibel zur DB/2-Familie gibt es ein Teil der Katalogsichten auch für die DB2/400 unter dem Schema SYSIBM. (je nach OS/400 Release mehr oder weniger Sichten).
Der Rest der Katalogsichten/-Tabellen steht im Schema QSYS2.
(Zum Begriff Schema : früher unter SQL auch Collection bzw. AS/400 Namensbegriff Bibliothek)


Hallo Sven,
war leider verhindert, deshalb verspätet die Antwort. Vorab möchte ich sagen,
dass ich Neuling bezüglich AS/400 DB2 bin. Die AS/400 Nomenklatur ist mir noch fremd.

Wenn ich im Navigator teste muss ich das/die Schema/Lib angeben. Die Procedure liegt laut SYSIBM.ROUTINES im "Specific_Schema" QGPL und "Routine_Schema" QGPL. Mit "call QGPL/routine()", dachte ich, kann ich im Navigator die Procedure aufrufen und testen. Der Tipp mit den SYSROUTINES war super. Nun kann ich ähnlich wie in Oracle meine Objekte angucken. Auf unser DB/2 heisst die Tabelle "SYSIBM.ROUTINES". Wird wahrscheinlich ab V8 so sein. Kannst du mir einen Auszug deiner "..ROUTINES" zukommen lassen, wo JAVA Procedures registriert sind und sich aufrufen lassen? Vielleicht erkennt man an den Spalten "External_Name;External Language" was bei mir schief läuft.

Gruß Andreas