[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    May 2004
    Beiträge
    470

    SQL Funktion mit Rückgabe eines arrays

    Hallo zusammen,

    ich teste im Moment ein wenig mit SQL Funktionen und bekomme es irgendwie nicht hin.
    Ich will 2 integer werte als Parameter übergeben und möchte in einem integer array 2 werte zurück erhalten.

    gemacht habe ich folgendes

    create type int_array2 as integer array[2]

    create or replace function test_add(a int, b int)
    returns int_array2
    language sql
    begin
    declare arr int_array2;
    set arr[1] = a + b;
    set arr[2] = a + b + b;
    return arr;
    end

    Wenn ich jetzt folgendes ausführe

    select test_add(5, 10) from sysibm.sysdummy1

    dann erhalte ich einfach den Wert 1 zurück.

    Wo ist mein Fehler, außer dass ich versuche SQL-Funktionen zu verwenden :-)

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Nun ja, machst du das über SQL-Scripts?
    Ich denke, Arrays sind eher was für embedded SQL. Also schreib ein ILRPG mit

    select test_add(5, 10)
    into : MyArray
    from sysibm.sysdummy1

    Wobei ich statische Arrays nicht empfehle. Da sind eigene Tabellen mit Join sinnvoller.
    Arrays können auch nicht in Where-Klauseln direkt verwendet werden sondern nur in der Form
    arraytype[n] = x.

    In konsequenz könnte also auch klappen:

    select test_add(5, 10)[1], test_add(5, 10)[2] from sysibm.sysdummy1
    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

  3. #3
    Registriert seit
    May 2004
    Beiträge
    470
    ich habe alles über STRSQL gemacht und dort aus geführt.
    Ich hätte es gerne später in einem SQL Script weiter verarbeitet.
    Also eine SQL Prozedur ruft diese SQL Funktion auf und verarbeitet das zurückgegebene array. Ich dachte nur man kann es sich auch ganz normal über SELECT anzeigen lassen

    Heißt also entweder so wie du es oben beschrieben hast im ILERPG
    oder in einer SQL Prozedur das Ergebnis wieder in eine Array Variable stellen.

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Was versprichst du dir von Arrays?
    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

  5. #5
    Registriert seit
    May 2004
    Beiträge
    470
    Also letztendlich geht es darum

    Ein String hat 1000 Zeichen. Jede Zeile dort ist mit ## getrennt. Also z.B. Zeile1##Zeile2##mehr Text##usw##
    Dieser String muss aufgeteilt werden in einzelne Felder. Die Datenbank hat maximal 18 Einzelfelder dafür.

    Das 2 ist ein String der hat auch ebenfalls 1000 Zeichen. Der muss aufgeteilt werden in einzelne Felder immer wenn eines der folgenden Zeichen vorkommt ,.; oder blank

    Alles muss über SQL gemacht werden. Leider habe ich es nicht ohne Schleife hinbekommen. Deshalb dachte ich mir, eine Funktion der ich einen 1000 stelligen String mitgebe und die mir ein Array mit de einzelnen Werten zurück gibt

    ich könnte natürlich auch einen langen String zurück geben mit fixer Länge für ein Element. Aber ich dachte nicht, dass arrays kompliziert sind

  6. #6
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Wo ist das Problem?

    Verwende dazu die Tablefunction Split:
    https://www.ibm.com/docs/en/i/7.5?to...table-function

    select table(systools.split(charfeld, '##'))
    from mytable

    Ich habe z.B. auch das Problem, dass für Bildschirmauswahlen Multiselect-Listen angeboten werden sollen. Der User kreuzt nun mehrere Elemente an und ich bekomme eine Kommaseparierte Liste zurück.
    Diese verwende ich dann z.B. in der Where-Klausel:

    where name in (select * from table(systools.split(: Param, ','))
    Funktioniert hervorragend.

    Das Gegenstück dazu ist die Funktion LISTAGG, mit der man mehrere Zeilen wieder in einen String packen kann.

    Nachtrag:
    Deine 18 Felder kannst du ja auch u.U. per concat erst zusammen führen:
    F1 concat '##' concat F2 .....

    Wenn du leere Felder ausschließen willst:

    concat case Fx when '' then '' else '##' concat Fx end
    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

  7. #7
    Registriert seit
    May 2004
    Beiträge
    470
    Hat super funktioniert, vielen Dank.
    Aber das funktioniert nur mit einem Trennzeichen oder gibts da auch was wo man mehrere Trennzeichen angeben kann. Also Zeile trennen bei ,.; oder blank

  8. #8
    Registriert seit
    Aug 2001
    Beiträge
    2.928
    ... nur mit Common Table Expressions oder mehreren Sub-Selects und mehreren SPLIT()s

    ... die UDTF SPLIT() steht in der Bibliothek SYSTOOLS.
    Die SQL Codes für alle SQL Routinen in SYSTOOLS können mit Generate SQL ermittelt werden.
    Die Funktionen in SYSTOOLS sind (u.a.) als Beispiele gedacht und es wird sogar empfohlen sich auf der Basis dieser Source Codes seine eigenen Funktionen zu schreiben.
    Also schau's Dir an, ob Du Dir eine neue Funktion, die Deinen Anforderungen entspricht schreiben kannst.
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 5. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    Ggf. ja, da der Separator ein langes varchar Feld ist, könnte die Angabe von '#,.;' möglicherweise funktionieren da laut Doku nur 1 Zeichen als Separator verwendet wird. '##' bringt da wohl nicht den gedachten Effekt, was du ggf. an Hand von Leerzeilen feststellen kannst.
    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

  10. #10
    Registriert seit
    May 2004
    Beiträge
    470
    Zitat Zitat von B.Hauser Beitrag anzeigen
    ... nur mit Common Table Expressions oder mehreren Sub-Selects und mehreren SPLIT()s

    ... die UDTF SPLIT() steht in der Bibliothek SYSTOOLS.
    Die SQL Codes für alle SQL Routinen in SYSTOOLS können mit Generate SQL ermittelt werden.
    Die Funktionen in SYSTOOLS sind (u.a.) als Beispiele gedacht und es wird sogar empfohlen sich auf der Basis dieser Source Codes seine eigenen Funktionen zu schreiben.
    Also schau's Dir an, ob Du Dir eine neue Funktion, die Deinen Anforderungen entspricht schreiben kannst.
    Das verstehe ich nicht. Wo sind die Quellcodes und wo gibt es Beispiele dafür. Was ist generate sql

    Ah ich verstehe was du meinst. Das SQL generieren lassen von einer Funktion aus der Bibliothek SYSTOOLS und gegebenenfalls anpassen in einer eigenen Funktion

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.695
    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

Similar Threads

  1. Statisches Embedded SQL: Verarbeitung eines Arrays möglich?
    By dschroeder in forum NEWSboard Programmierung
    Antworten: 10
    Letzter Beitrag: 25-05-23, 19:04
  2. SQL Prozedur mit Cursor als Rückgabe (Embedded SQL)
    By harkne in forum NEWSboard Programmierung
    Antworten: 14
    Letzter Beitrag: 16-06-20, 10:45
  3. SQL-Aufruf eines Webservices in SQL-Funktion einbauen
    By KM in forum NEWSboard Programmierung
    Antworten: 7
    Letzter Beitrag: 09-02-17, 10:39
  4. Rückgabe eines Arrays aus einer Funktion
    By harkne in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 04-01-06, 16:44
  5. 2 Dimensionale Arrays mit RPG
    By Atomik in forum IBM i Hauptforum
    Antworten: 1
    Letzter Beitrag: 26-10-01, 14:07

Berechtigungen

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