-
Dann les dazu mal die Beschreibung:
The RTNPARM keyword specifies that the return value of a procedure is to be handled internally as a
parameter of the same type as the defined returned value, passed by reference.
Da der zusätzliche Parameter unbenannt ist, lässt er sich also nicht direkt ansprechen.
Die Wirkung entfaltet sich erst, wenn man ein Ergebns im Return spezifiziert, da dieses dann nicht in einer Zwischenvariablen sondern direkt übergeben wird.
Es bringt aber keinen Vorteil, wenn man sowieso eine benannte Variable benötigt die dann beim Return den Wert doch wieder kopieren muss.
Ansonsten: laut Doku bringt es besonders bei großen Returnwerten etwas, da der automatische Speicher dadurch nicht belastet wird.
Zu beachten sind aber besonders die Hinweise bzgl. %PARMS und %PARMNUM, da diese Funktionen den Wert um 1 größer melden.
-
... das ist wieder so eine typische RPG-Denke. Das sind auf heutigen Rechnern nicht mal Mikrosekunden, die man da vermeintlich einspart und den eigentlichen Pferdefuß übersieht man: die RTNPARM Arie verhindert caching, was in vielen Fällen mehr bringt. Was Speicher sparen angeht: das verträgt sich nicht mit der zunehmenden Verfettung der RPG Runtime durch Gimmicks wie dynamische Feldgruppen (hier sei am Rande erwähnt, dass es schon seit langem Open Source Komponenten gibt, die das besser können).
D*B
-
Zitat von B.Hauser
Du kannst auch mit SQL gezielt auf Daten zugreifen und dir nur das rausholen, was Du brauchst.
File-Referenz-Variablen kannst Du mit SQL-Funktionen genau wie alphanumerische Felder behandeln, d.h. mit POSSTR oder LOCATE kannst Du positionieren und suchen, mit SUBSTR kannst Du Daten gezielt herauslesen und dann in eine (kürzere) Host-Variable ausgeben.
... und Du bist auch nicht auf 16MB beschränkt, sondern kannst die ganzen (möglichen) 2GB verarbeiten. (Die Daten werden überigens nicht kopiert)
Beispiel:
Code:
DCL-S MyClobFile SQLTYPE(CLOBFILE) CCSID(1208);
...
MyCLOBFile_Name = %Trim(ParIFSFile);
MyCLOBFile_NL = %Len(%Trim(MyCLOBFile_Name));
MyCLOBFile_FO = SQFRD; //Read Only
For Index = 1 to 15;
Start = (Index-1) * RowLen + 1;
Exec SQL Set :MyText = Substr(:MyCLOBFile, :Start, :RowLen);
Dsply MyText;
If SQLCODE = 100 or SQLCODE < *Zeros
or %Len(%Trim(MyText)) = *Zeros;
Leave;
EndIf;
EndFor;
Birgitta
Hinweis für alle, die sich für dieses Thema interessieren: Das Programmbeispiel von Birgitta ist fast korrekt. Der SQLTYPE muss allerdings mit Unterstrich getrennt werden: CLOB_FILE.
Aber mit einer anderen Sache haben wir ganz schön gekämpft: Im obigen Beispiel greift man mit substr auf den Clob zu. Das funktioniert nicht korrekt, wenn es sich um Mixed Data Strings handelt ! Das ist bei UTF-8 der Fall, wo ja die einzelnen Zeichen durch unterschiedliche viele Bytes ausgedrückt werden. Substr akzeptiert zwar einen UTF-8 String, interpretiert die Positionsangaben aber als Byte, nicht als Zeichen!
(Steht in der SQL Referenz "im Kleingedruckten").
Die Lösung ist aber einfach: Es gibt zusätzlich die Funktion "substring" (also alles ausgeschrieben). Die Funktion kann mit echten Zeichenzählungen umgeben!
Aber nochmals Danke an Birgitta für das Programmbeispiel. Hat uns sehr weitergeholfen!
Dieter
-
Noch ein Hinweis:
Auch die SQL Funktion length kommt mit Mixed Byte Strings (wie UTF-8) nicht zurecht. Es gibt aber die Funktion character_length. Die zählt echte Zeichen und nicht etwa Bytes!
-
Was hilft einem das für Substring?
Bei der Angabe der CCSID zur CLOB_FILE könnte man mal versuchen die 1200 für UCS16 zu verwenden.
Dann sollte beim Lesen der Datei von 1208 in 1200 gewandelt werden und Substring wieder funktionieren.
Performant ist das nicht gerade. Einfacher wäre dann, die Datei in einen Lob-Locator vom Typ DBCLOB abzulegen. Dann kann man per Substring ja darauf zugreifen.
Dann wird nur 1x auf die IFS-Datei zugegriffen, der Rest passiert im Speicher.
Vergiss nicht, den Locator auch wieder frei zu geben.
-
substring funktioniert ja mit utf-8. Nur substr geht nicht! Ich wollte nur darauf hinweisen, dass es inzwischen einige SQL Funktionen gibt, die auf den ersten Blick genau das machen, was die alten Funktionen (substr, length) auch gemacht haben. Aber die neuen Funktionen (substring, character_length) funktionieren eben auch bei UTF-8 korrekt, während die alten Funktionen falsche Ergebnisse liefern.
Zu dem Freigeben muss ich aber nochmal nachfragen: Ich mache den Zugriff ja wie im obigen Beispiel beschrieben:
DCL-S MyClobFile SQLTYPE(CLOBFILE) CCSID(1208);
...
MyCLOBFile_Name = %Trim(ParIFSFile);
MyCLOBFile_NL = %Len(%Trim(MyCLOBFile_Name));
MyCLOBFile_FO = SQFRD;
Dann arbeite ich auf dem Clob mit den SQL-Funktionen substring und character_length. Muss ich danach nochmal irgendetwas freigeben?
-
Freigabe brauchst du da nicht, da du ja keinen Locator nimmst.
Dein Verfahren liest die Datei komplett ein, nimmt den Substring und verwirft den Inhalt wieder.
Je nach dem wie häufig du da auf eine Datei zugreifst, dauert das halt.
-
Danke für die Antwort. So hatte ich es mir beim Programmieren auch vorgestellt. Gefühlt geht das ganze rasend schnell. Ich habe aber keine Messungen durchgeführt.
-
Hallo Brigitta,
dein Beispiel oben läuft bei mir rudimentär.
Ich möchte eine IFS-CSV-Datei lesen, und zwar Satzweise,
bis EOF.
Was muss ich noch beachten ?
Danke im voraus.
-
Ich habe dir auf den anderen Beitrag geantwortet. Warum immer alles neu erfinden?
-
Danke für eure Hilfe, habe nun die Lösung per SQL gefunden: Super gut
SELECT CAST(LINE AS CHAR(3000))
FROM TABLE(QSYS2.IFS_READ(PATH_NAME =>
'/IMTECH/SELKUKEY3.CSV', END_OF_LINE => 'CRLF'))
ACS kann es ohne CAST
-
Ich verstehe aber immer noch nicht, warum du eine CSV selber lesen und ggf. auseinanderfriemeln und konvertieren willst.
Similar Threads
-
By dschroeder in forum NEWSboard Programmierung
Antworten: 5
Letzter Beitrag: 29-03-19, 13:56
-
By Theo in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 02-03-18, 12:46
-
By dschroeder in forum NEWSboard Programmierung
Antworten: 7
Letzter Beitrag: 12-12-17, 13:32
-
By Rainer Ross in forum NEWSboard Programmierung
Antworten: 5
Letzter Beitrag: 28-10-16, 16:16
-
By Bleil in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 13-10-01, 20:15
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks