-
Clob als Parameter in einem RPGLE-Programm
Guten Morgen,
ist es eigentlich möglich, einen Clob als Parameter in einem RPGLE-Programm zu deklarieren?
Wenn ich z.B. eine Funktion oder stored Procedure in SQL bauen möchte, sind die Variablenlängen ja sehr begrenzt. (Max 16000 Zeichen bei Unicode). SQL unterstützt dafür ja den Datentyp CLOB. Die Frage ist nun, wenn ich aus SQL heraus ein RPG-Programm aufrufen möchte, wie sage ich dem RPG Programm, dass sein Übergabeparameter vom Typ CLOB ist?
Ich habe schon einiges ausprobiert, aber es klappt nicht mit dem Compiling.
Hier mein Versuch:
Code:
**free
dcl-ds clobDS_templ sqltype(clob:1000000) template end-ds;
dcl-s text char(100);
//==================================================================================
//Main:
//==================================================================================
dcl-pi *n;
clobDS likeDS(clobDS_templ);
end-pi;
text = um_fillstr('Dies ist ein Test. ' : 10000);
clobDS_data = text;
clobDS_len = %len(text);
*inlr = *on;
return;
Vielen Dank im Voraus!
Dieter
-
Noch ein Hinweis: Wenn ich versuche, das obige PGM zu kompilieren, bekomme ich sehr viele Fehlermeldungen, die ich hier gar nicht alle posten kann. Der Compiler kann mit den ganzen Sache nichts anfangen.
-
Ein Parameter vom Typ CLOB ist leider nicht möglich. Du kannst CLOB ausschließlich in SQL verwenden.
Allerdings kannst du das Feld auch als Zeichenfeld definieren.
Dein Problem wird lediglich sein, wenn der Aufrufer mal zu wenig bereitstellt.
-
Zitat von dschroeder
Noch ein Hinweis: Wenn ich versuche, das obige PGM zu kompilieren, bekomme ich sehr viele Fehlermeldungen, die ich hier gar nicht alle posten kann. Der Compiler kann mit den ganzen Sache nichts anfangen.
... wie hast du das compilierte? das Klopp Feld wird erst vom pre Compiler umgesetzt und dessen Umsetzung müsste doch wohl als Parameter verwendbar sein.
D*B
-
Zitat von BenderD
... wie hast du das compilierte? das Klopp Feld wird erst vom pre Compiler umgesetzt und dessen Umsetzung müsste doch wohl als Parameter verwendbar sein.
D*B
Die Fehlermeldungen kommen vom Compiler. Der Precompiler läuft durch. Trotzdem gibt es Fehler wegen irgendwelcher nicht definierten Variablen. Es ist auch ein Unterschied, ob ich die Deklaration des Template oberhalb oder unterhalb der Eingangsparameter mache. Bei normalen Variablen spielt das ja keine Rolle.
-
Zitat von Fuerchau
Ein Parameter vom Typ CLOB ist leider nicht möglich. Du kannst CLOB ausschließlich in SQL verwenden.
Allerdings kannst du das Feld auch als Zeichenfeld definieren.
Dein Problem wird lediglich sein, wenn der Aufrufer mal zu wenig bereitstellt.
Ich möchte ja eine große Zeichenkette an eine SQL-Procedure oder Funktion übergeben. Würde es denn deiner Meinung nach gehen, wenn ich in der SQL-Procedure einen Parameter als clob deklariere und im RPG den Parameter z.B. als varchar(1000000) ?
Meine Idee wäre es noch, eine eigene Datenstruktur zu bauen, die den gleichen Aufbau wie die vom Precompiler generierte SQLTYPE Struktur hat. Ich habe das aber noch nicht probiert.
-
... der precompiler interessiert sich schnöde nicht für die like definition (so schlau ist der nicht). Nimm doch einfach
d bklopp s a len(1000000)
d ccsid(*jobrunmix)
D*B
-
Vielen Dank. Ich werde das mal ausprobieren.
-
Es scheint tatsächlich zu gehen, wenn man in der stored Procedure die Parameter als clob deklariert und im RPG-Programm einen varchar-Parameter mit passender Länge deklariert.
Ich habe etwas getestet und keine Probleme festgestellt.
Hier mein funktionierendes Beispiel:
-- Stored Procedure:
Code:
create or replace procedure scr/prcA (
in text1 clob(1M),
out text2 clob(1M) )
Language RPGLE
Not Deterministic
modifies sql data
called on null input
Parameter Style general
external name 'SCR/A';
-- SQL Funktion:
Code:
create or replace function scr/fktA(
text1 clob(1M)
)
returns clob(1M)
language sql
modifies sql data
not deterministic
begin
declare text2 clob(1M);
set text2 = '';
CALL scr.prcA(text1, text2);
return text2;
end;
//RPG:
Code:
**free
//==================================================================================
//Main:
//==================================================================================
dcl-pi *n;
clob1 varchar(1000000) const;
clob2 varchar(1000000);
end-pi;
clob2 = 'hallo ' + clob1 + ' ende';
*inlr = *on;
return;
Beispielaufruf:
select scr.fktA('Test') from sysdummy1;
=> Ergebnis: hallo Test ende
Similar Threads
-
By dholtmann in forum NEWSboard Programmierung
Antworten: 13
Letzter Beitrag: 22-07-16, 08:57
-
By Malte in forum NEWSboard Java
Antworten: 2
Letzter Beitrag: 19-02-16, 10:01
-
By philsturm in forum NEWSboard Programmierung
Antworten: 14
Letzter Beitrag: 01-09-14, 09:43
-
By XMan in forum NEWSboard Programmierung
Antworten: 3
Letzter Beitrag: 20-12-13, 08:50
-
By Markus Ralf in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 08-08-01, 14:29
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