[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Feb 2017
    Beiträge
    41

    httpPostBlobVerbose und negativer SQLCODE im SQLRPGLE

    Hallo,

    wir wollen die SQL httpPostBlobVerbose Funktion zum Upload von Dateien nutzen.
    Mir ist nun aufgfallen, das wenn ich von der Gegenseite einen http Code ungleich 2xx zurückbekomme, ich auch einen SQL Fehler bekomme. Im interaktiven SQL sehe ich aber dennoch im Ergebnis den zurückgelieferten http Header. Im SQLRPGLE wird die Host Variable allerdings nicht gefüllt, wenn der SQL Befehl nicht erfolgreich war.

    Gibt es eine Möglichkeit trotzdem an den zurückgelieferten Header zu kommen bzw. das füllen der Host Variablen zu erzwingen? Vielleicht eine SQL Option o.ä.?

    Gruß,
    Manuel

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    https://www.ibm.com/support/knowledg...tpoverview.htm

    includeErrorMsg = true

    sollte ggf. Informationen liefern.
    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

  3. #3
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Hallo Manuel,

    wie seht denn dein SQL genau aus?
    Es gibt einen Message-Part und einen Header-Part.
    Der Header-Part sollte immer zurückgeliefert werden, wenn es vom Server einen Antwort gibt.

    Du bekommst nur nichts zurück, wenn du versuchst auf einen Host zuzugreifen, der nicht existiert oder ein Timeout bekommst.

    lg Andreas

  4. #4
    Registriert seit
    Feb 2017
    Beiträge
    41
    @Andreas:
    Den Header Part bekomme ich auch zurück, allerdings nur wenn ich den SQL interaktiv im ACS ausführe. Aber auch im ACS sehe ich im Protokoll den SQL Fehler. Das Problem ist, das wenn ich einen negativen SQLCODE im RPG bekomme, meine Host Variablen nicht gefüllt werden.
    Einen negativen SQLCODE bekomme ich sobald, der http code ungleich 2xx ist. Also z.B. auch wenn die Authentifizierung ungültig ist.
    Das ist der Quellcode:
    exec sql
    select t.responseHttpHeader into :responseHttpHeader
    from table(systools.httppostblobverbose(:url, :httpHeader, :blobFile)) t;
    if (SQLCODE <> 0);
    writeLog('postFile': '20':responseHttpHeader);
    writeLog('postFile': '20':'httppostblobverbose() failed. SQLCODE: ' + %char(SQLCODE));
    return *off;
    endif;

    Das ist übrigens die Message die ich im ACS neben dem Ergebnis sehe:
    SQL State: 01H52 Vendor Code: 462 Message: [SQL0462] Prozedur oder benutzerdefinierte Funktion HTTPPOSTCLOBVERBOSE in SYSTOOLS hat einen SQLSTATE der Art Warnung zurückgegeben. Ursache . . . . : Ein SQLSTATE im Format 01xxx wurde von der Prozedur oder der benutzerdefinierten Funktion HTTPPOSTCLOBVERBOSE in SYSTOOLS (mit SPECIFIC NAME HTTPP00015) zusammen mit Nachrichtentext Server returned HTTP response code: 401 for URL: https://accounts.accesscontrol.windo...tokens/OAuth/2 zurückgegeben. Fehlerbeseitigung: Dem Benutzer muss die Bedeutung der Warnung klar sein. Den Datenbankadministrator oder den Autor der benutzerdefinierten Funktion oder Prozedur zu Rate ziehen. Statement ran successfully, with warnings

  5. #5
    Registriert seit
    Feb 2017
    Beiträge
    41
    @Fuerchau
    includeErrorMsg ändert leider nichts am Ergebnis bzw. SQLCODE.

  6. #6
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Ich muss gestehen, ich selbst führe das SQL immer im Zuge eines INSERT INTO aus.
    Also
    Insert Into ... from final table (select * from ...)
    Dann hab ich den HTTP Header und die Response Message zusammen.
    Durch die Tabelle kann man das ganze sehr gut tracken, was wann für ein Request übermittelt wurde (ich speichere mir auch die URL ab) und was ich als Antwort erhalten habe.
    Da hab ich dann auch HTTP Error Codes 3xx, 4xx usw. drinnen stehen.

  7. #7
    Registriert seit
    Feb 2017
    Beiträge
    41
    Ja das hatte ich in einem anderen Beitrag von dir auch gelesen und werde ich dann wohl auch genauso machen.
    Ich hatte nur die Hoffnung, das wenn so eine Funktion angeboten wird, ich auch ohne Umwege an das Ergebnis komme. Das ein http Code ungleich 2xx zurück kommt, ist ja nichts ungewöhnliches und sollte meiner Meinung nach nicht zu einem SQL Fehler/Warning führen.
    Ich werd dafür mal ein RFE einstellen.

    Danke & Gruß,
    Manuel

  8. #8
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Letzteres ist auch zu empfehlen.
    Ich hatte auch ein Problem mit einer selbst gestrickten Table-Function.
    Der "INSERT INTO .... select * from table (...)" lieferte auch eine Warnung, die an das Programm allerdings mit einem positiven SQLCODE gemeldet wurde.
    Ein RUNSQLSTM kam sogar dann mit einem Fehler SQL9xxx (Systemfehler) zurück obwohl alles i.O. war.
    Hier hilft tatsächlich nur ein Wrapper, da die Ausgabe ja unabhängig erstellt wurde.
    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

  9. #9
    Registriert seit
    Jun 2013
    Beiträge
    69
    Hallo Manuel,

    falls du das Problem noch hast, ich konnte das für mich wie folgt lösen

    Im RPG einmal mit ifNull damit ich die null Werte verarbeiten kann
    Exec Sql
    SELECT IfNull(responseMsg, ''),
    VarChar(IfNull(responseHttpHeader, ''), 1500)
    INTO :zzCLOB, :ResponsHeader
    FROM table(
    SYSTOOLS.HTTPGETCLOBVerbose(:host, :Header)
    ) as Ws;

    Die includeErrorMsg Option muss httpHeader als Atributt angegeben werden und nicht als Feld was ich vorher immer falsch gemacht hatte

    HTML-Code:
    <httpHeader includeErrorMsg="true">    <header name="Content-Type" value="text/json;charset=UTF-8"/> </httpHeader>
    ich hoffe das konnte dir helfen

    MfG Malte

  10. #10
    Registriert seit
    Feb 2017
    Beiträge
    41
    Hallo Malte,

    war jetzt eine Woche im Urlaub... Hatte am Freitag vorletzter Woche auch zum Test mein SQL ähnlich wie du es vorschlägst mal angepasst, hab anstelle von ifnull coalesce genommen.
    Aber super, dann war das ja kein Zufall sondern scheinbar die Lösung um an den Header zu kommen.
    Finde ich persönlich auch besser, da man sich die Zwischentabelle spart.

    Danke für deinen Tipp.

    Gruß,
    Manuel

  11. #11
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Hast Du Dir eigentlich mal die Funktion HTTPHEAD (in Bibliothek SYSTOOLS) angesehen?
    HTTPHEAD Scalar Function.
    Im übrigen würde ich die JSON-Daten nicht in eine RPG-Variable einlesen ... um dann die Daten wohl auch noch mit YAJL auflösen zu können. Mit dieser Lösung können nur JSON-Dokumente mit maximal 16MB eingelesen werden.
    Wenn die Daten dagegen direkt mit SQL aufgelöst werden, können JSON-Datem bis zu 2 GB verarbeitet werden.

    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

  12. #12
    Registriert seit
    Feb 2017
    Beiträge
    41
    Die HTTPHEAD Funktion hatte ich einmal überflogen, dann aber nicht weiterverfolgt, weil auf der Gegenseite nicht implementiert ist.

    Die Limitierung der RPG Variablen auf 16MB war/ist mir bewusst, kann ich aber bei den Funktionen die ich aufrufen muss in Kauf nehmen. Im ersten Schritt mache ich einen HTTPPOSTCLOB und die maximale Größe der Antwort ist 4MB. Bei dem HTTPPOSTBLOB bekomme ich im Body und Header maximal 1MB zurück, wobei mich nur der Header interessiert.

    YAJL benutze ich nicht. Nach dem Besuch deiner XML/JSON Schulung vor 2 (oder 3) Jahren verwende ich ausschließlich die Funktionen die die Datenbank mitbringt und bisher gabe es nichts was mit SQL nicht umsetzbar war.

    Danke & Gruß,
    Manuel

Similar Threads

  1. SQLCODE bei Verarbeitung mehrere SQL
    By Hawi in forum NEWSboard Programmierung
    Antworten: 26
    Letzter Beitrag: 04-11-21, 21:49
  2. SQLCODE -805 beim Zugriff auf ein fernes System
    By mahones in forum NEWSboard Programmierung
    Antworten: 31
    Letzter Beitrag: 02-04-20, 11:21
  3. SQLCODE = -206
    By Hubert in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 14-10-19, 14:02
  4. SQLRPGLE
    By malzusrex in forum NEWSboard Programmierung
    Antworten: 5
    Letzter Beitrag: 09-06-16, 12:36
  5. SQLCODE = -000000811. in einem SQLCBLLE
    By nico1964 in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 29-06-15, 07:53

Berechtigungen

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