Moin zusammen,
ich habe eine Frage bezüglich des Verhaltens eines HTTPGETBLOB - Aufrufs.
Ich habe, je nach Einsatzzweck entweder ein RPG Programm oder eine SQL-UDF erstellt, die Daten von einem Rest-Webservice abrufen und entsprechend dem unterlagerten Systemen bereitstellen.
SQL-UDF-Definition:
Code:
CREATE FUNCTION PGM.MYFUNC (
PNR DECIMAL(7, 0) )
RETURNS CHAR(50)
LANGUAGE RPGLE
SPECIFIC PGM.MYFUNC
NOT DETERMINISTIC
READS SQL DATA
RETURNS NULL ON NULL INPUT
EXTERNAL NAME 'PGM/MYFUNC(SQL_FUNC)'
PARAMETER STYLE GENERAL ;
RPG-Programm mit embedded SQL und Serviceprogramm:
Code:
DSQL_FUNC PI 50A
D PNR 7 0
*
*š//Initialisierung Work-Felder
D WEB_URL S 255 VARYING
D VALIDITY_DTE S D
D SQLERG S 50A
D ORT S 50A INZ(*BLANKS)
C TIME VALIDITY_DTE
/FREE
CALLP INIT_ENV();
WEB_URL = 'https://user:password@xxx.de/' +
'employee-data-transfer/api/employee/' + %CHAR(PNR) +
'/birthplace?validityDate=' + %CHAR(VALIDITY_DTE);
/END-FREE
*
C/EXEC SQL
C+ SELECT RESULT.* into :SQLERG
C+ FROM XMLTABLE(
C+ '$result'
C+ PASSING
C+ XMLPARSE(DOCUMENT SYSTOOLS.HTTPGETBLOB(:WEB_URL, '')
C+ ) as "result"
C+ COLUMNS birthplace CHAR(50) PATH 'birthplace'
C+ ) AS result
C/END-EXEC
*
C IF SQLCOD = *ZEROS
C EVAL ORT = SQLERG
C ENDIF
*
C RETURN ORT
Im INIT_ENV werden Umgebungsvariablen gesetzt:
CALL QCMDEXC('ADDENVVAR ENVVAR(JAVA_HOME) VALUE(''/QOpenSys/QIBM/ProdData/JavaVM/jdk60/64bit'') REPLACE(*YES)');
CALL QCMDEXC('ADDENVVAR ENVVAR(QIBM_JAVA_PROPERTIES_FILE) VALUE(''/QIBM/userdata/java400/my.properties'') REPLACE(*YES)');
Der Webservice ist so aufgebaut, dass er eine 404 Meldung zurückgibt, wenn keine Daten gefunden wurden (z.B. ungültige Personalnummer als Parameter mitgegeben).
Der Rückgabewert ist dann wie folgt:
- 38000(-443)[IBM][System i Access ODBC Driver]SQL0443 (0,60 secs)
- S1000(-4302)[IBM][System i Access ODBC Driver][DB2 for i5/OS]SQL4302 - Die gespeicherte Java-Proz. oder benutzerdef. Funktion SYSTOOLS.HTTPGETBLOB mit dem spezifischen Namen HTTPG00001 wird mit der Ausnahmebed. https://xxx:xxx@xxx.de/employee-data...ate=2017-11-16 abgebrochen. (0,48 secs)
Ist dieses Verhalten so normal? Kann man das abfangen - auch eine explizite Abfrage des SQLCODES und das Zurückgeben von *BLANKS hilft nicht. Habe ich einen Fehler gemacht?
Ich bin über jede Hilfe dankbar!
Viele Grüße
BM
Bookmarks