[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte
  1. #1
    Registriert seit
    May 2015
    Beiträge
    11

    Inhalt eines Pointers ermitteln mit SQL

    Hallo zusammen,

    erstmal wünsche ich allen ein schönes Weihnachtsfest gehabt zu haben.

    Ich würde gerne wissen, was in SQL die Entsprechung für die RPG-Build-in-Function %STR ist.
    Zum Hintergrund:
    Ich muss eine Nachricht einlesen, von der ich erstmal nur den Pointer habe und ich nicht weiß, wie groß sie ist.
    Mein Plan daher in ein sehr großes CLOB-Feld die Nachricht zu übernehmen und anschließend die aufbereitung durchzuführen.
    In RPG kann ich das Feld aber nicht groß genug definieren, daher die Idee mit SQL.

    Evtl. weiß ja einer Rat.

    Viele Grüße

    Jörg

  2. #2
    Registriert seit
    Jun 2001
    Beiträge
    1.973
    SQL weis ich auch grad nicht.
    aber in RPG kannst du den Pointer doch verschieben!

    fülle Feld (256 o.ä.) aus Pointeradresse
    verarbeite Feld
    Feld zu ende?
    ja: weiter
    nein: pointer erhöhen
    nochmal
    ..

    Guten Rutsch

    Robi
    Das Notwendige steht über dem technisch machbaren.
    (klingt komisch, funktioniert aber!)

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    Reichen 16MB als Größe nicht?
    Ansonsten:
    Mittels "select length(myclob) from mytable" kannst du die Größe des Feldes abfragen.
    Mittels "select substr(myclob, start, len) from mytable" kannst du die Teile passend laden.

    Alternativ kannst du in ILERPG auch den Teraspace aktivieren. Dann kann eine Variable auch 2TB groß werden.
    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

  4. #4
    Registriert seit
    May 2015
    Beiträge
    11
    Hallo zusammen,

    erstmal Danke für die Antworten.
    Das Problem ist, dass ich die Nachricht mit einem C-Programm eines Softwareanbieters lese und aus dieser Blackbox lediglich den Pointer zurück bekomme.
    Im Debug sehe ich lediglich die ersten 1024 Stellen und in einer Log-File habe ich die Beschränkung auf 32766 Stellen. Diese sehen gut aus, allerdings kann ich hier erkennen, dass die Nachricht Länger sein muss.
    Ich habe jetzt mal versucht Robis Tipp zu folgen, und die Nachricht erstmal in einen Array zu laden, was mich allerdings auch schnell an die Grenzen von RPG brachte.
    Mein Versuch in eine per SQL erstelle CLOB-Datei die Daten mittels write auszugeben scheiterte schon am Compiler.
    Der Plan war nun in einem SQL-RPG den Pointer als Parameter zu übernehmen und diese dann die Daten in die CLOB-Datei zu schreiben.
    Dazu müsste ich aber das SQL-Argument kennen um den Pointer aufzulösen.

    Viele Grüße

    Jörg Lindner

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    SQL kennt keine Pointer. Da muss man schon mit RPG oder einer anderen Programmiersprache arbeiten.

    Wenn Du versuchen willst die Nachricht in eine CLOB-Variable zu sichern und aus dieser zu lesen kommst Du an die gleichen Grenzen wie mit RPG, d.h. eine CLOB-Variable kann maximal 16 MB groß sein. Das entspricht der Maximal-Länge einer RPG-Variablen - Keine Rede von 32766-Zeichen, das ist das Maximum für eine SQL VARCHAR-Variable.

    Wenn Du die Nachricht ins IFS schreibst ( nicht mit SQL das geht nicht! sondern z.B. mit C bzw. den unixtype APIs) kannst Du diese IFS-Datei im Anschluss mit SQL über eine File-Reference-Datei (CLOB_FILE) auslesen.
    CLOB-Files können bis zu 2 GB groß sein.

    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

  6. #6
    Registriert seit
    Aug 2001
    Beiträge
    2.869
    Zitat Zitat von Fuerchau Beitrag anzeigen
    Alternativ kannst du in ILERPG auch den Teraspace aktivieren. Dann kann eine Variable auch 2TB groß werden.
    Wer behauptet das?
    Lt. der aktuellen RPG-Referenz (7.3) ist die Maximal-Länge einer RPG Variablen, Datenstruktur oder Feldgruppe auf 16 MB beschränkt:
    Auszug aus RPG Referenz - Appendix - Restrictions
    The maximum length for a fixed-length character field is 16773104.
    The maximum length for a variable-lengthcharacter field is 16773100.
    Wenn man in den Teraspace geht, heißt das lediglich, dass man mehr! große Variablen im Speicher verwalten kann.

    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

  7. #7
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    ... SQL ist da definitiv das falsche Werkzeug. Wenn Du das denn unbedingt mit RPG machen willst/musst (immerhin schon besser geeignet als CL oder COBOL) musst Du das Abschnittweise abarbeiten. Wenn Du Dir eine based Variable definierst, positionierst Du diese durch Zuweisung des Pointers aus dem Schnittstellenprogramm auf den Start, durch Addition eines Offsets auf den Startpointer verschiebst Du dann deine "Fenstervariable" längs des erhaltenen Speichers. Am Ende des erhaltenen Speichers (spätestens) hast Du dann ein Problem...
    Vielleicht solltest Du mal genauer sagen, was Du da vorhast, dann gibt es durchaus eine gute Chance, Dir einen besseren Vorschlag zu machen...

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  8. #8
    Registriert seit
    May 2015
    Beiträge
    11
    Hallo zusammen,

    also dass SQL nicht mit Pointern kann ist zwar nicht die Aussage, die ich hören wollte aber damit muss ich wohl leben. ;-)

    Ich habe jetzt mal einen Versuch gestartet mit einem Datenfeld von 16000000 Stellen und hoffe das das ausreicht. Allerdings habe ich in der Verarbeitung einen Ausstieg aus der Schleife entdeckt, der wohl etwas früh war. Den habe ich jetzt mal geändert und warte auf neue Testdaten.
    @BenderD
    ich muss Daten aus einer Queue des Java-Message-Service auf die iSeries übernehmen. Dies passiert mit Tibco-EMS for iSeries.
    Bei kleinen Dateien funktionierte es auch gut.
    Diese Daten kommen im XML-Syntax allerdings als Text-Message. Da ich m Vorfeld nicht weiß, wie groß die Daten sind, war meine Intention die Bereiche auf der iSeries so großzügig wie möglich zu gestalten um für alle Eventualitäten gerüstet zu sein.
    Daher auch die Idee mit dem CLOB-Feld, dass ich mit einem RPGLE nicht ansprechen kann. Das umwandeln der Quelle ist in ein SQLRPGLE leider durch unser Repository-System nicht so einfach möglich.
    Also werde ich jetzt auf die Testdsaten warten und muss es zur Not im Debugger mit einzelnen schritten prüfen.

    Trotzdem Vielen Dank an alle.

    Jörg

  9. #9
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    ... dann hast du doch jetzt folgendes deklariert:
    d myVeryLongVar s .... based(mvlvP)
    d mvlvP s *
    und machst dann irgendwo:
    mvlvP = myBlackBox(...);
    und dann taucht der Inhalt in myVeryLongVar auf.
    wenn dann am Schluss noch weiteres kommt, verschiebt man mit:
    mvlvP = mvlvP + myOffset;
    und weiter geht's...

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  10. #10
    Registriert seit
    May 2015
    Beiträge
    11
    Hallo zusammen,

    nicht ganz, aber so ähnlich.
    MyFeld char(16000000)
    eval myFeld = %str(BlackboxPointer)
    zusätzlich eine Logfile um zu sehen wie die Message ankommt, also ob sie komplett ist oder im EMS schon Größenbegrenzungen greifen.
    dou Start >= 16000000
    Start = 1;
    Logfilesatz = %subst(myFeld: Start: 32766);
    Start += 32766;
    enddo;
    Das sollte mir erstmal weiterhelfen.

    Vielen Dank An alle.

    Jörg

  11. #11
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von jlindner Beitrag anzeigen
    MyFeld char(16000000)
    eval myFeld = %str(BlackboxPointer)
    ... da wird Dir der Rest bereits abgeschnitten und gegebenen Falls mit blanks hinten aufgefüllt. Das solltest Du schon so machen, wie von mir skizziert.
    was kriegst Du denn mit %len(%str(BlackboxPointer)) ?

    D*B
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  12. #12
    Registriert seit
    May 2015
    Beiträge
    11
    Hallo D*B,

    ich habe jetzt einen Test durch mit der wahrscheinlich größten Nachricht und die kommt auf eine Länge von 3.487.283. Also denke ich das die 16.000.000 reichen werden.

    Viele Grüße

    Jörg

Similar Threads

  1. Inhalt CLOB Feld in IFS-Datei
    By alex61 in forum IBM i Hauptforum
    Antworten: 7
    Letzter Beitrag: 06-07-16, 12:51
  2. MONMSG: Inhalt abfragen
    By JoergHamacher in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 03-02-16, 12:47
  3. Parameter eines Programms ermitteln
    By Daechsle in forum IBM i Hauptforum
    Antworten: 14
    Letzter Beitrag: 18-06-15, 09:26
  4. OFFSET zwischen POINTERs
    By jsranko in forum IBM i Hauptforum
    Antworten: 12
    Letzter Beitrag: 26-02-15, 10:43
  5. aktuelles Statement in einem ILE-Programm eines fremden Jobs ermitteln
    By Ottersberg in forum NEWSboard Programmierung
    Antworten: 13
    Letzter Beitrag: 04-09-14, 11:31

Tags for this Thread

Berechtigungen

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