[NEWSboard IBMi Forum]
Seite 1 von 2 1 2 Letzte

Hybrid View

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

    SQL UDF erstellen - Best practices

    Hallo zusammen,

    ich möchte verstärkt SQL Programmierung betreiben und dabei SQL Funktionen programmieren

    Dafür brauche ich mal ein paar Tipps von euch:

    Insbesondere das Debugging von SQL Funktionen macht mir Schwierigkeiten.

    Wenn ich das richtig sehe, wird für eine SQL UDF automatisch ein C-Serviceprogramm erzeugt. Wenn man die SQL-Funktion debuggen will, muss man im Systemdebugger von ACS doch dieses C-Programm angeben, oder?

    Bei einer kleinen Testfunktion klappt das und ich bekomme im Debugger den SQL-Code angezeigt und kann ihn im Einzelschritt durchgehen. Bei einer größeren Funktion dagegen wird der C-Code angezeigt.

    Es ist auch etwas mühsam, das C-Serviceprogramm zu identifizieren, da der Programmname vom Betriebssystem generiert wird.

    Deshalb hier mal ein paar Fragen:

    1. Kann man in einer SQL-Funktion eigentlich festlegen, wie der Name des zugehörigen Programms ist?
    2. Die SQL-Funktion kann ja einen längeren Namen als 10 Zeichen haben. Es würde sich vielleicht anbieten, den Namen des C-Programm dann so zu nennen, wie der Sourcemember der SQL-Funktion heißt, damit man wieder 10 Zeichen hat. Das würde dann aber bedeuten, dass man nicht 2 SQL-Funktionen in einem Source haben sollte?
    3. Gibt es bessere Möglichkeiten des Debuggings? Z.B. per VSCode oder so?
    4. Wie handhabt ihr das?

  2. #2
    Registriert seit
    Feb 2001
    Beiträge
    20.350
    1: "specific name" gibt den 10-stelligen Namen an.
    2: Das passiert leider nicht automatisch, da hätte ja einer mitgedacht. Man kann aber auch IFS-Dateien nehmen bzw. PC-Dateien, und dann?
    Der Wartbarkeit wegen: 1 Funktion/Prozedur/Type o.ä. => 1 Datei, denn damit generiert man nur das Programm, dass sich ändert. Du kannst natürlich auch alles in eine Quelle packen. Ich habe da dann nur Probleme immer mit dem Semikolon;-).
    Außerdem mache ich das ja auch per Datei/Index/Constraint/Trigger.
    3: der Debugger ist schon IBM i-spezifisch, wobei allerdings in meinen Augen der STRDBG der effektivste ist. Auf Grund von SQL-Multthreading funktioniert dies nur sauber per STRSRVJOB von einem Terminal aus. Daher teste ich Funktionen immer per STRSQL und nicht per ODBC, da ich da immer erst den korrekten Job ermitteln muss. Es kann da aber auch ab und an dann ein SQL-Timeout passieren.
    Per RDi o.ä. soll es ja auch gehen, aber das ist doch eher fehleranfällig, da ja 2 Systeme beteiligt sind.
    Über "set options DBGVIEW = *SOURCE" ist das Debuggen auch einfacher.
    4: s.o.

    Und da eben auch nicht alles per SQL geht, schreibe ich auch gerne SQL-Procedure/Function mit external RPG im SQL-Stil (Parameter + Nullanzeiger + SQL-Variablen).
    Und da manchmal SQL nicht direkt gewünscht ist, auch schon mal Service-Wrapper in ILERPG, die dann trotzdem die SQL-Function aufrufen.
    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
    Jan 2012
    Beiträge
    1.153
    Zitat Zitat von Fuerchau Beitrag anzeigen
    3: der Debugger ist schon IBM i-spezifisch, wobei allerdings in meinen Augen der STRDBG der effektivste ist. Auf Grund von SQL-Multthreading funktioniert dies nur sauber per STRSRVJOB von einem Terminal aus. Daher teste ich Funktionen immer per STRSQL und nicht per ODBC, da ich da immer erst den korrekten Job ermitteln muss. Es kann da aber auch ab und an dann ein SQL-Timeout passieren.
    Per RDi o.ä. soll es ja auch gehen, aber das ist doch eher fehleranfällig, da ja 2 Systeme beteiligt sind.
    Zum Debuggen habe ich doch nochmal eine Frage. Der grafische Debugger aus ACS ist schon recht unhandlich. Deshalb habe ich gedacht, ich befolge deinen Rat und debugge das mit STRDBG.

    Ich habe also den Job identifiziert, der das SQL ausführt und habe den entsprechenden STRSRVJOB gestartet.

    Dann muss ich ja mit STRDBG das zu debuggende Programm angeben, oder? Das kann ja eigentlich nur das generierte C-Serviceprogramm sein, denke ich. Debuggst du das? Ich würde natürlich gerne meinen SQL-Source step by step durchdebuggen.

    Im RDi geht das Debuggen von SQL gar nicht, denke ich. Oder gibt es da doch etwas?

  4. #4
    Registriert seit
    Nov 2020
    Beiträge
    353
    Beim CREATE Statement musst du die debug-View mitgeben:

    CREATE OR replace PROCEDURE prouzalib.testproc1 (IN p1 varchar(10))
    LANGUAGE SQL
    SET OPTION dbgview=*SOURCE
    BEGIN
    ...

    Du solltest im STRDBG die Debug-Sicht ändern können.
    Im RDi und mitlerweile im vscode kannst du das nach dem gleichen Prinzip debuggen.
    Im RDi musst du "Debug für Job" (heißt das glaub ich) auswählen.
    Hinterlegt Job + PGM und startest den Debug.
    Dann im Greenscreen ins STRSQL und die SQL Funktion oder Prozedur aufrufen.
    Du kannst nebenbei auch statt STRSQL ein SQL Tool deiner Wahl benützen, du brauchst nur die Job-Infos der Session

  5. #5
    Registriert seit
    Jan 2012
    Beiträge
    1.153
    Vielen Dank, Andreas.

    Ich weiß nicht genau, was ich eben falsch gemacht habe. Aber jetzt wird ohne weiteres Zutun der SQL Code beim STRDBG angezeigt.

    Das mit RDi probiere ich morgen mal aus.

  6. #6
    Registriert seit
    Mar 2002
    Beiträge
    5.304
    ... best practis ist: nur Zugriffsfunktionen in die Datenbank, keine Business logic!!!
    Im übrigen wäre ich mit dem SQL Compiler sehr vorsichtig!!! Viele features sind in der SQL reference nicht eindeutig dokumentiert und die beiden redbooks waren vor einiger Zeit grauen- fehlerhaft. Ob sich das gebessert hat, habe ich jetzt länger nicht verifiziert; ich vermeide Probleme, die ich nicht haben muss.

    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/

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.350
    Da Businesslogik, i.d.R., von Transaktionen lebt und Commit/Rollback sich in SQL-Features verbieten, auch wenn es trotzdem viele machen und sich wundern, ist das nahezu selbstverständlich.
    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

  8. #8
    Registriert seit
    Jan 2012
    Beiträge
    1.153
    Vielen Dank an euch beide. Das sind wertvolle Tipps.

    Die Sache mit der Businesslogik ist etwas problematisch. Seit 30 Jahren handhaben wir das so, wie Dieter Bender es geschrieben hat: Keine Business Logik in SQL.

    Aber seit einigen Jahren stellen wir verstärkt Webservices auf der IBM i zur Verfügung. Da bekommen wir bei rein RPG basierten Services schnell Größenprobleme bei der Rückgabe des Json. Deshalb haben wir uns entschlossen zukünftig mehr SQL based Services zu bauen und dann clobs zurückzugeben. SQL kann da ja 2GB verkraften.
    Das führt dann dazu, dass wir vermehrt SQL Funktionen benötigen, um die Daten zu ermitteln. Meistens kapseln die UDFs nur bestehende RPG-Programme. Aber manchmal holen wir damit inzwischen auch selbständig Daten, weil es aus Performance-Gründen notwendig ist.

  9. #9
    Registriert seit
    Feb 2001
    Beiträge
    20.350
    Also auch in RPG kann ich ja mit CLOB's für JSON umgehen um diese bereitzustellen.
    Allerdings sollte man sich hier tatsächlich überlegen, ob für Webservices hier mehr als 100KB, max. ggf. 2MB an Daten zurückgegeben werden müssen.
    Da wird vom Client auch gerne ein Paging verwendet, dass ungeführ dem Umfang einer Browser-Seite entspricht (20-50 Zeilen), Page 1 - N.

    Die Crux hier ist tatsächlich, dass für die Kommunikation zwischen RPG und Client eine Schicht eingezogen werden muss (Node.js, Java, Python, PHP, ...), um die Businesslogik nicht auch noch neu schreiben zu müssen. Und was bietet sich da einfacher an als SQL?
    Ggf. kann man Services in RPG ja auch via "dcl-f .... HANDLER(XXX)" bauen. Im Handler kann der Web-Service laufen und per RPG-READ/WRITE die Kommunikation.
    Da würde zwar je Client ggf. ein eigener Server-Job benötigt, aber das ist performanceseitig das geringste Problem.
    Da SQL intern multithreaded arbeiten kann, ILERPG aber nicht, verlangsamen externe UDF's das System maßgeblich.
    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
    Nov 2020
    Beiträge
    353
    Ich habe da eher den pragmatischen Ansatz dazu.
    Wenn man SQL hört, denken alle gleich an DB-Zugriffe und dementsprechend darf da keine Business-Logik hinein.
    Ich trenne hier viel mehr zwischen Daten-Zugriffe & Verarbeitung.
    Beides kann in RPG, in SQL, Python, Java & Co geschrieben werden können.

    Damals was die Diskussion: Wie viel Char darf eine Spalte/Variable haben.
    Dieser Gedanke kommt aus dem Zeitalter als die Systeme noch KB oder MB RAM hatten.
    Die gleiche Diskussion sehe ich heute immer wieder mit DB Zugriffe.
    Wenn ich es schaffe diese Zugriffe aus der Business-Logik raus zu nehmen, ist es egal was in welche Sprache dies gemacht wird

  11. #11
    Registriert seit
    Feb 2001
    Beiträge
    20.350
    "Wenn ich es schaffe diese Zugriffe aus der Business-Logik raus zu nehmen" meinte Dieter ja auch;-).
    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

  12. #12
    Registriert seit
    Jan 2012
    Beiträge
    1.153
    Anfangs haben wir bei Webservices auch angenommen, dass es reicht, wenige MB (mit RPG) zurückzugeben. Für Listen mit mehr Daten haben wir dann Paging eingebaut. Wir haben aber das Problem, dass wir einige Business-Objekte haben (z.B. Versicherungsverträge), die so komplex sind, dass das 2 oder 3 MB nicht reichen, um ein Objekt zu beschreiben. Wird müssten dann unsere Business-Objekte in kleinere logische Objekte aufspalten oder wird müssten unsere großen Objekte als Byteketten betrachten und dass dann im Paging herausgeben oder wir müssten die Speichergrenze mittels SQL umgehen. Und das ist im Moment der Ansatz, den wir verfolgen.

Similar Threads

  1. Artikel: Rahmenprogramm Best Practices
    By NEWSolutions Redaktion in forum NEWSolutions artikel
    Antworten: 0
    Letzter Beitrag: 11-08-15, 17:07
  2. Erstellen einer UDF mit UNION
    By e_sichert in forum IBM i Hauptforum
    Antworten: 9
    Letzter Beitrag: 09-05-08, 13:25
  3. Job m.best. Anforderungen erstellen
    By deni87991 in forum IBM i Hauptforum
    Antworten: 3
    Letzter Beitrag: 10-04-06, 14:14
  4. PWRDWNSYS nach best. Job und IPL zu best. Datum/Uhrzeit
    By cassandra in forum IBM i Hauptforum
    Antworten: 5
    Letzter Beitrag: 30-04-03, 14:39

Berechtigungen

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