Anmelden

View Full Version : Clob als Parameter in einem RPGLE-Programm



dschroeder
26-06-19, 09:23
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:


**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

dschroeder
26-06-19, 09:29
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.

Fuerchau
26-06-19, 10:12
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.

BenderD
26-06-19, 10:41
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

dschroeder
26-06-19, 10:45
... 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.

dschroeder
26-06-19, 10:48
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.

BenderD
26-06-19, 11:17
... 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

dschroeder
26-06-19, 11:33
Vielen Dank. Ich werde das mal ausprobieren.

dschroeder
26-06-19, 11:53
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:


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:


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:


**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