-
SQL Udf für Serviceprogramm mit Referenzparameter
Hallo zusammen,
ich habe mich ein wenig mit ChatGpt unterhalten und ChatGpt behauptet, dass ich eine SQL UDF schreiben kann, die ein RPGLE-Serviceprogramm benutzt, das In/Out Parameter hat. Es hat beim Codieren bisher nicht geklappt. Aber mal die Frage: Kann das gehen?
Konkret: Mein Serviceprogramm hat folgende Parameterschnittstelle:
Code:
dcl-proc DAX99##_checkAuthorization export;
dcl-pi *n varchar(10000);
i#token varchar(10000) const;
i#_clientId varchar(50) const;
i#_role varchar(100) const;
i#pgmName char(10) const;
i#procName varchar(60) const;
i#dl_rec packed(15) const;
r#httpStatusCode int(10);
r#username varchar(100) options(*nopass);
end-pi;
Der letzte Parameter ist optional, den will ich in der UDF gar nicht ansprechen. Aber der vorletzte Parameter "r#httpStatusCode" ist nicht als const definiert. Kann ich das Serviceprogramm trotzdem in der UDF benutzen?
Hier die UDF:
Code:
create or replace function edpgmlib/DAX99##_checkAuthorizationUdf (
i#_token varchar(10000),
i#_clientId varchar(50),
i#_role varchar(100),
i#_pgmName char(10),
i#_procName varchar(60),
i#_dl_rec dec(15),
inout i#_httpStatusCode integer )
returns nvarchar(10000)
specific edpgmlib/DAX99##_checkAuthorizationUdf
language rpgle
not deterministic
modifies sql data
called on null input
disallow parallel
EXTERNAL NAME 'EDPGMLIB/DAX99##01(DAX99##_CHECKAUTHORIZATION)'
parameter style general;
Das SQL lässt sich nicht ausführen, solange ich das Schlüsselwort inout vor dem Parameter " i#_httpStatusCode" stehen habe. Wenn ich inout wegnehme, lässt es sich ausführen. Aber wohin würde das RPG-Programm denn seinen geänderten Parameter hinschreiben, wenn ich ein Literal übergebe?
LG,
Dieter
-
ChatCPT hat gelogen!
Bei einer SQL UDF müssen alle Ausgabewerte über den Ausgabe-Parameter zurückgegeben werden.
Wenn man mehrere Werte zurückgeben will, erstellt man eine UDTF, die man dann in den From-Anweisungen eines SELECT-Statements einbindet.
Bei User Defined Function (egal ob table oder skalar) sind die Parameter per Default IN (Input-Parameter), d.h. zwischen IN/OUT/INOUT kann man erst gar nicht wählen und folglich auch nicht angeben.
-
Hallo Birgitta,
vielen Dank für die klare Antwort. Es ist leider nicht das erste Mal, dass ChatGPT "halluziniert". Aber manchmal sind die Tipps der KI ganz gut.
Liebe Grüße,
Dieter
-
Ich verwende für sowas grundsätzlich den sog. SQL-Style.
Der hat den Vorteil, dass es zu jedem Parameter und/oder Returnwert auch einen NULL-Anzeiger gibt.
Damit kann man a) Null-Werte behandeln, b) NULL zurückgeben.
Wenn man nicht immer alle Parameter benötigt, kann man mit sog. Überladungen dieselbe Prozedur mit verschiedenen Parametern definieren.
Wobei die Überladungen nur einen SQL-Body benötigen, der die eigentliche UDF mit Defaults, eben NULL, für die fehlenden Parameter aufruft.
Das macht SQL dann erst so richtig flexibel.
Parameter an die Prozedur werden grundsätzlich per Referenz übergeben (CONST ändert das nicht und VALUE ist für SQL nicht erlaubt).
SQL (und auch RPGLE) generiert für nicht passende Parameter sowieso neue Felder. Wenn du also eine Konstante in In/Out übergibst, bekommst du ganz normal deine Input-Variable, nur wenn du da was reinschreibst, ist es halt weg.
Out Parameter müssen als Felder angegeben werden.
ChatGPT hat in so weit recht, wenn Überladungen von Prozeduren erstellt werden, was anscheinend vorausgesetzt wurde;-).
-
Es gibt eine einfache Grundregel:
Bei SQL Funktionen wird der Rückgabewert über den RETURN gemacht.
Bei SQL Prozeduren wird der Rückgabewert über die Parameter (mit IN, OUT und INOUT) gesteuert.
SQL Table Function liefern beim RETURN halt eine Tabelle zurück.
Das was du also willst ist eher eine SQL Prozedur.
Du könntest auch eine SQL Prozedur erstellen, um den Wert aus dem Parameter zu erhalten.
Und dann noch eine SQL Funktion schreiben, in der du die SQL Prozedur aufrufst und dann mit RETURN den zurückgelieferten Wert der SQL Prozedur, zurückgeben:
SQL Funktion --> SQL Prozedur --> RPG Prozedur
lg Andreas
-
Vielen Dank für eure Infos.
Mit ist klar, wie es mit SQL-Procedures und Table-Functions geht. Mein Problem war, dass ich ein fertiges RPGLE-Serviceprogramm habe, was bereits im Einsatz ist. Dieses fertige Programm möchte ich gerne in einer SQL-UDF nutzen. Und da war ich mir unsicher, was mit dem In/Out-Parameter passiert, wenn RPG da irgendwas reinschreibt. Wenn der Wert einfach verworfen wird (davon gehe ich aufgrund der Posts mal aus), ist das für mich OK.
LG, Dieter
Similar Threads
-
By opeker in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 21-10-15, 12:42
-
By dschroeder in forum NEWSboard Programmierung
Antworten: 27
Letzter Beitrag: 02-12-14, 09:33
-
By hartmuth in forum NEWSboard Programmierung
Antworten: 2
Letzter Beitrag: 24-07-14, 10:52
-
By loisl in forum NEWSboard Programmierung
Antworten: 4
Letzter Beitrag: 08-11-13, 16:37
-
By roko in forum IBM i Hauptforum
Antworten: 5
Letzter Beitrag: 19-08-09, 06:08
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