[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2005
    Beiträge
    13

    Java Stored Procedure

    Hallo,
    ich versuche eine Java Stored Procedure aufzurufen. Im ersten Schritt
    habe ich ein kleines Java Programm erstellt.
    Code:
     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:
    Code:
    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

  2. #2
    Registriert seit
    Oct 2004
    Beiträge
    240
    Meiner Meinung nach müsste es

    ...


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

    Siehe auch:

    http://publib.boulder.ibm.com/iserie...2929/index.htm

    LG
    Robert P.

  3. #3
    Registriert seit
    Jan 2005
    Beiträge
    13
    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

    Zitat Zitat von RobertPic
    Meiner Meinung nach müsste es

    ...




    EXTERNAL NAME 'JDummy!main'



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

    Siehe auch:

    http://publib.boulder.ibm.com/iserie...2929/index.htm

    LG
    Robert P.

  4. #4
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    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

    Zitat Zitat von HeisigA
    Hallo,
    ich versuche eine Java Stored Procedure aufzurufen. Im ersten Schritt
    habe ich ein kleines Java Programm erstellt.
    Code:
     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:
    Code:
    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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  5. #5
    Registriert seit
    Jun 2001
    Beiträge
    727
    Was ich nicht verstehe ist der Aufruf :

    ....call QGPL/jdummy()
    Also ich würde es mal mit :

    Code:
    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 :
    Code:
    CREATE PROCEDURE JDummy()
    LANGUAGE JAVA
    PARAMETER STYLE JAVA
    NOT FENCED
    EXTERNAL NAME 'JDummy!JDummy'

  6. #6
    Registriert seit
    Jan 2005
    Beiträge
    13
    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

    Zitat Zitat von Sven Schneider
    Was ich nicht verstehe ist der Aufruf :



    Also ich würde es mal mit :

    Code:
    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 :
    Code:
    CREATE PROCEDURE JDummy()
    LANGUAGE JAVA
    PARAMETER STYLE JAVA
    NOT FENCED
    EXTERNAL NAME 'JDummy!JDummy'

  7. #7
    Registriert seit
    Jan 2005
    Beiträge
    13
    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

    Zitat Zitat von BenderD
    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

  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.873

    Redbooks

    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
    2. Stored Procedures, Triggers and User Defined Functions on DB2 Universal Database for iSeries

    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  9. #9
    Registriert seit
    Jan 2005
    Beiträge
    13
    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

    Zitat Zitat von B.Hauser
    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
    2. Stored Procedures, Triggers and User Defined Functions on DB2 Universal Database for iSeries

    Birgitta

  10. #10
    Registriert seit
    Jun 2001
    Beiträge
    727
    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)

    Zitat Zitat von HeisigA
    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

  11. #11
    Registriert seit
    Mar 2002
    Beiträge
    5.287
    Hallo,

    - 390 und as400 ist im Bereich stored Procedures absolut nichts übertragbar.
    - ohne entsprechende Patch Stände auf der AS400 funktioniert das ohnehin nicht, im normalen Cum Pflegeprozess bleibt das alles unberücksichtigt. Erforderlich sind die sogenannten Group PTFs für Java und für DB2; je nach Basis Release haben die unterschiedliche Nummern und Fundstellen, das sollte aber mit Mr. Google zu finden sein.
    - Bei den unterschiedlichen Methoden keinne Erfolg zu haben wäre es auch noch interessant die genauen Fehlermeldungen zu bekommen, sind das immer dieselben? und welche genau mit allen Details (wobei das ohne Patches keinen Sinn macht weiter zu probieren).
    Zu beachten ist noch, dass die Fehlermeldungen bei Oops Nerv im Joblog des ServerJobs zu suchen sind und beim interaktiven SQL auf die lokale Maschine im Joblog des eigenen Jobs.

    mfg

    Dieter Bender

    Zitat Zitat von HeisigA
    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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

Similar Threads

  1. Berechtigung für Stored Procedure
    By rebe in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 12-10-06, 11:22
  2. SQL Stored Procedure verschwindet
    By florian in forum IBM i Hauptforum
    Antworten: 10
    Letzter Beitrag: 17-05-06, 16:08
  3. Stored Procedure *debugging*
    By Bratmaxxe in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 04-04-06, 10:45
  4. Stored Procedure mit Problemen
    By peter.kinne in forum IBM i Hauptforum
    Antworten: 13
    Letzter Beitrag: 15-04-05, 09:04
  5. Löschen/Überschreiben einer Stored Procedure
    By Frank Pusch in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 13-06-01, 17:57

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •