-
Vielen Dank für die beiden Antworten. Ich werde eurem Rat folgen und das ganze mit SQL machen!
Viele Grüße,
Dieter
-
Was die Pointer angeht, so muss ich sogar via SQLDA Pointer angeben (nebst SQLType und Attributen).
Somit kann ich auch schön per %ALLOC Speicher zur Verfügung stellen.
SQLDA's werden dann per "using" bei den entsprechenden SQL-Befehlen angegeben.
Dann kann ich eben auch innherhalb von RPGLE wiederum mit Pointern umgehen.
Zu beachten ist noch folgendes:
In meinem Beispiel habe ich 8MB Unicode (CCSID 1200) verwendet. Sollte die Datei tatsächlich mal größer sein, sollte man hier dann mit LOB-Locator umgehen: GET_[DB/C]LOB_FROM_FILE.
Der Vorteil des Locator's besteht halt darin, dass das Lesen der Datei und die Codewandlung in den Speicher nur 1x passiert.
Anschließend kann man sich per SQL-Stringfunktionen dann die Teile herausholen.
Dies dürfte wohl performanter sein, als sich die Daten scheibchenweise aus der Datei zu holen, zumal bei UTF-8 eine Zeichenposition direkt ja nicht errechenbar ist (UTF-8 => 1-4Byte je Zeichen).
-
Irgendwie klappt das bei mir noch nicht:
Code:
dcl-s clobFile sqltype(CLOB_FILE) CCSID(1200);
dcl-s text varucs2(300000);
clobFile_Name = %trim(file);
clobFile_NL = %len(%trim(clobFile_Name));
clobFile_FO = SQFRD; //Read Only
exec sql set :text = :clobFile;
return text;
Beim Kompilieren bekomme ich immer:
"Variable TEXT nicht definiert oder nicht verwendbar. Reason: No declaration for the variable exists, the declaration is not within the current scope, or the variable does not have an equivalent SQL data type."
Hat jemand eine Idee?
-
Das Problem hat sich erledigt. Habe einen Doppelpunkt vor der Variable "TEXT". Der darf da nicht hin.
-
Sorry für mein wirres Schreiben heute. Das Problem hat sich doch nicht erledigt. Der Doppelpunkt ist natürlich erforderlich.
Also nochmal: Hat jemand eine Idee?
-
Ja, da hat RPGLE leider noch ne kleine Macke:
Definiere in den H-Zeilen zusätzlich die CCSID für UCS2:
h ccsid(*ucs2:*utf16)
Ich habe allerdinsg die Variable so deklariert:
dcls-s FileString SQLTYPE(DBCLOB:8000000) ccsid(1200);
-
So kompiliert er es:
Code:
dcl-proc UM_StmfToStrUni export;
dcl-pi *n varucs2(300000);
file varchar(2000) const; //file incl. Pfad
end-pi;
dcl-s clobFile sqltype(DBCLOB_FILE);
dcl-s clobDS sqltype(dbclob:300000) ccsid(1200);
dcl-s text varucs2(300000);
clobFile_Name = %trim(file);
clobFile_NL = %len(%trim(clobFile_Name));
clobFile_FO = SQFRD; //Read Only
exec sql set :clobDS = :clobFile;
text = clobDS;
return text;
end-proc;
Geht das auch "speichersparender"? Ich habe ja bereits die Variable clobDS mit 300000 deklariert. Für die Rückgabe benötige ich anscheinend nochmal extra eine passende Variable text mit nochmal 300000 Zeichen.
-
OK,
jetzt habe die Lösung ohne die zusätzliche Text-Variable:
Code:
dcl-proc UM_StmfToStrUni export;
dcl-pi *n varucs2(300000);
file varchar(2000) const; //file incl. Pfad
end-pi;
dcl-s clobFile sqltype(DBCLOB_FILE);
dcl-s clobDS sqltype(dbclob:300000) ccsid(1200);
clobFile_Name = %trim(file);
clobFile_NL = %len(%trim(clobFile_Name));
clobFile_FO = SQFRD; //Read Only
exec sql set :clobDS = :clobFile;
if clobDS_len > 0;
return %trimr(%subst(clobDS_data:1:clobDS_len));
else;
return %ucs2('');
endif;
end-proc;
Ich werde jetzt mal verschiedene Tests durchführen, ob auch alle Zeichen korrekt gelesen werden.
-
Ich arbeite da ein wenig anders.
Als Returnwert verwende ich grundsätzlich einen Indicator, so dass ich die Funktion direkt im IF aufrufen kann:
dcl-pr GetFile ind;
FileName varucs2(256) const;
Record varucs2(8000000);
end-pr;
if GetFile(FileName:Buffer);
// Tu was
endif;
Den Puffer übergebe ich nicht per CONST sondern per Referenz. Somit spare ich mir auch das Kopieren des Inhalts noch mal im Return. Der Parameter ist ebenso Ziel des SQL's.
Somit vereinfacht sich auch das Ergebnis:
exec sql .....
return SQLCODE = *zero;
Wichtig ist natürlich, dass die CCSID der Streamfile umwandelbar ist. Ich habe in einer einderen Anwendung bei einem Fehler, da ich UTF8 erwarte, noch mal den "CHGATR OBJ(...) ATR(CCSID) VALUE(1208)" durchgeführt und den Import wiederholt.
-
Ich hatte eben auch schon einige Probleme mit den CCSIDs meiner Testdateien. Aber es scheint zu laufen.
Das mit der Parameterübergabe per Referenz hat für mich den Nachteil, dass das rufende Programm eine exakt passende Variable bereitstellen muss. Wenn ich den Dateiinhalt als Rückgabeparameter zurückgebe, kann ich direkt die Zuweisung in eine (kleinere) Variable durchführen, z. B. in ein Bildschirmfeld.
Nochmal danke für eure Hilfe.
-
Das prüft der Compiler über haupt nicht.
Ich hatte schon des öfteren mal Tippfehler bei der Übergabe von DS'n an eine Prozedur. Das hat den Kompiler in keinster Weise gestört ob die DS'n gleich lang definiert sind, geschweige, dass auch noch die Struktur der DS geprüft wurde.
Bei Single-Variablen magst du Recht haben.
Allerdings ist es korrekt, dass die Maximalgröße dann vorgesehen werden muss, aber auch das ließe sich per Parameter (wie bei API's auch) definieren.
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