[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Jan 2012
    Beiträge
    1.120

    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

  2. #2
    Registriert seit
    Aug 2001
    Beiträge
    2.874
    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.
    Birgitta Hauser

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

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

  4. #4
    Registriert seit
    Feb 2001
    Beiträge
    20.242
    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;-).
    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
    Nov 2020
    Beiträge
    331
    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

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

  1. Serviceprogramm und SQL-Command „get diagnostics“
    By opeker in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 21-10-15, 12:42
  2. User Defined Function in SQL, Datumsübergabe an Serviceprogramm
    By dschroeder in forum NEWSboard Programmierung
    Antworten: 27
    Letzter Beitrag: 02-12-14, 09:33
  3. Variable als Parameter für SUBSTR in SQL-Anweisung (UDF)
    By hartmuth in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 24-07-14, 10:52
  4. SQL Funktion ruft Serviceprogramm auf - Parameter übergabe
    By loisl in forum NEWSboard Programmierung
    Antworten: 4
    Letzter Beitrag: 08-11-13, 16:37
  5. UDF mit ServiceProgramm und *null-parameter
    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
  •