[NEWSboard IBMi Forum]

Hybrid View

  1. #1
    Registriert seit
    Jan 2012
    Beiträge
    1.102

    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

  2. #2
    Registriert seit
    Jan 2012
    Beiträge
    1.102
    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.

  3. #3
    Registriert seit
    Feb 2001
    Beiträge
    20.207
    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.
    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
    Jan 2012
    Beiträge
    1.102
    Zitat Zitat von Fuerchau Beitrag anzeigen
    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.

  5. #5
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    ... 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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  6. #6
    Registriert seit
    Jan 2012
    Beiträge
    1.102
    Vielen Dank. Ich werde das mal ausprobieren.

  7. #7
    Registriert seit
    Jan 2012
    Beiträge
    1.102
    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

  8. #8
    Registriert seit
    Mar 2002
    Beiträge
    5.286
    Zitat Zitat von dschroeder Beitrag anzeigen
    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
    AS400 Freeware
    http://www.bender-dv.de
    Mit embedded SQL in RPG auf Datenbanken von ADABAS bis XBASE zugreifen
    http://sourceforge.net/projects/appserver4rpg/

  9. #9
    Registriert seit
    Jan 2012
    Beiträge
    1.102
    Zitat Zitat von BenderD Beitrag anzeigen
    ... 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.

Similar Threads

  1. Prozeduren in Servicepgm von einem Anderen Programm aus aufrufen.
    By dholtmann in forum NEWSboard Programmierung
    Antworten: 13
    Letzter Beitrag: 22-07-16, 09:57
  2. Antworten: 2
    Letzter Beitrag: 19-02-16, 11:01
  3. 2 Bildschirmdateien in einem RPG-Programm
    By philsturm in forum NEWSboard Programmierung
    Antworten: 14
    Letzter Beitrag: 01-09-14, 10:43
  4. RPGLE Parameter *NOPASS
    By XMan in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 20-12-13, 09:50
  5. Alarm aus einem RPG-Programm
    By Markus Ralf in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 08-08-01, 15:29

Berechtigungen

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