-
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 :-)
-
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
-
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.
-
Was versprichst du dir von Arrays?
-
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
-
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
-
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
-
... 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.
-
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.
-
 Zitat von B.Hauser
... 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
-
Similar Threads
-
By dschroeder in forum NEWSboard Programmierung
Antworten: 10
Letzter Beitrag: 25-05-23, 19:04
-
By harkne in forum NEWSboard Programmierung
Antworten: 14
Letzter Beitrag: 16-06-20, 10:45
-
By KM in forum NEWSboard Programmierung
Antworten: 7
Letzter Beitrag: 09-02-17, 10:39
-
By harkne in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 04-01-06, 16:44
-
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
-
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