[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Feb 2001
    Beiträge
    20.753
    Naja, eine Prozedur, die ein externes Programm aufruft, muss auch entsprechend definiert werden.
    D.h., beim CREATE PROCEDURE wird der Name des aufzurufenden Programmes sowie Übergabeparameter mitgegeben.

    Der Aufruf erfordert dann nur noch den Prozedurnamen und die Parameter.

    Das Gleiche gilt auch fur CREATE FUNCTION, nur dass diese einen Returnwert hat.

    Beispiel eier CREATE FUNCTION:

    Code:
    CREATE FUNCTION USMOD_16/DATESERIAL   
           (YEAR INTEGER,                 
            MONTH INTEGER,                
            DAY INTEGER)                  
           RETURNS DATE                   
    LANGUAGE RPGLE                        
    EXTERNAL NAME 'USMOD_16/DATSER'       
    DETERMINISTIC                         
    RETURNS NULL ON NULL INPUT            
    NO SQL                                
    NO EXTERNAL ACTION                    
    PARAMETER STYLE SQL                   
    ALLOW PARALLEL                        
    NOT FENCED
    Beispiel des zugehörigen ILERPG's:

    Code:
    hactgrp(*caller) dftactgrp(*no) datfmt(*iso)     
                                                     
    d SYear           s             10I 0            
    d SMonth          s             10I 0            
    d SDay            s             10I 0            
                                                     
    d SQLDate         s               d              
    d SYear_Ind       s              5I 0            
    d SMonth_Ind      s              5I 0            
    d SDay_Ind        s              5I 0            
                                                     
    d SQLDate_Ind     s              5I 0            
    d SQLState        s              5               
    d FuncName        s            139    varying    
    d SpecName        s            128    varying    
    d DiagMsg         s             70    varying    
                                                               
    c     *entry        plist                                  
    c                   parm                    SYear          
    c                   parm                    SMonth         
    c                   parm                    SDay           
    c                   parm                    SQLDate        
    c                   parm                    SYear_Ind      
    c                   parm                    SMonth_Ind     
    c                   parm                    SDay_Ind       
    c                   parm                    SQLDate_Ind    
    c                   parm                    SQLState       
    c                   parm                    FuncName       
    c                   parm                    SpecName       
    c                   parm                    DiagMsg        
    c*                                                         
    c/free                                                     
        if SYear_ind <> *zero                            
        or SMonth_ind <> *zero                           
        or SDay_ind <> *zero;                            
           SQLDate_ind = -1;    // Ergebnis ist NULL     
        else;                                            
           monitor;                                      
              SQLDate = %date('0001-01-01')              
                       + %Years(SYear-1)                 
                       + %Months(SMonth-1)               
                       + %Days(SDay-1);                  
           on-error *all;                                
              SQLDate_ind = -1;    // Ergebnis ist NULL  
           endmon;                                       
        endif;                                           
     /end-free                                           
    c*                                                   
    c*                           
    c                   return
    Weiteres findest du im SQL-Referenzhandbuch
    http://publib.boulder.ibm.com/infoce...e/launcher.htm

    Suche dort nach SQL.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  2. #2
    Registriert seit
    Sep 2009
    Beiträge
    10
    Hallo!

    Herzlichen dank für diese ausführliche und sehr hilfreiche Antwort! Sie haben mir sehr weiter geholfen.

    In unserer kleinen Gruppe, angehender RPG Programmierer, sind Sie sehr bekannt, dank diesem Forum! Ich glaube, ich werde Sie noch öfters um Rat erbitten müssen

    Nochmals, tausend Dank!

    lg

  3. #3
    Registriert seit
    Sep 2009
    Beiträge
    10
    Hallo!

    Tut mir leid, aber ich muss wieder um hilfe erbitten

    Der Programmaufruf via stored procedures funktioniert mit Java super. Jetzt versuche ich auch Parameter zu übergeben, aber das ist wieder eine Hürde die ich nicht alleine bewältigen kann.

    Code:
    CREATE PROCEDURE JT1
    (IN nachricht CHAR(120),
    IN empfaenger CHAR(15))
    EXTERNAL NAME 'SRC25/JTST1' LANGUAGE CL
    Code:
    0001.00              PGM        PARM(&NACHRICHT &EMPFAENGER)                                 090921
    0002.00              DCL        VAR(&NACHRICHT) TYPE(*CHAR) LEN(120)                         090921
    0003.00              DCL        VAR(&EMPFAENGER) TYPE(*CHAR) LEN(15)                         090921
    0004.00              SNDMSG     MSG(&NACHRICHT) TOUSR(&EMPFAENGER)                           090921
    0005.00 ENDPGM                                                                               090921
    Code:
                cstmt1 = con.prepareCall("{call qgpl.JT1(?, ?)}");
                cstmt1.setString(1, "Hallo du hilfreiche AS400 Community!");
                cstmt1.setString(1, "SCHULE25");
                cstmt1.execute();
    Vielleicht sehe ich auch einfach den Wald vor lauter Bäumen nicht, ich weiß es nicht, aber bedanke mich schonmal im vorraus bei allen!

    liebe grüße

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.753
    Hier ist das Problem der SQL-Signatur.

    Wichtig ist also, dass die Parameter GENAU so übergeben werden, wie sie die Prozedur erwartet.
    In deinem Fall übergibst du 2 Strings, also VARCHAR an Stelle von 2 fixen CHAR-feldern.

    Hier hilft dann das Casting:
    cstmt1 = con.prepareCall("{call qgpl.JT1(cast(? as char(120)), cast(? as char(15)))}");

    Dann stimmt auch die Signatur und SQL findet die Prozedur.

    Hintergrund:
    SQL erlaubt genauso wie Java identische Prozedurnamen mit unterschiedlichen Parameterlisten.
    An Hand dieser Signatur wird die passende Prozedur ermittelt.
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

Similar Threads

  1. Rückgabewert vom RPG Programm
    By mk in forum NEWSboard Java
    Antworten: 8
    Letzter Beitrag: 21-04-11, 22:51
  2. Programm auf "ferner" AS400 ausführen.
    By Souljumper in forum NEWSboard Programmierung
    Antworten: 6
    Letzter Beitrag: 13-05-09, 20:50
  3. SQL im Programm
    By steven_r in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 19-10-06, 10:12
  4. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 10:43

Berechtigungen

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