[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Sep 2004
    Beiträge
    129

    SQL Fenced oder NOT Fenced

    Hallo Forum!

    Ich hab eine UDF die aus einer Datei einen Wert ausliest und den zurück gibt. Diese hab ich in ein Serviceprogramm gepackt das bis vor kurzem noch in einer benannten Aktivierungsgruppe gelaufen ist. Hab das ändern müssen weil ich da drinnen auch QCMDEXC laufen hab das OVRDBF und dergleichen machen muß.

    In einem Trigger wird diese Funktion aus RPG aus aufgerufen. Hat bis jetzt immer klaglos funktioniert, aber nachdem ich das Serviceprogramm als ACTGRP(*CALLER) kompiliert hab, stürzt die UDF mit Bomben und Granaten ab. Wenn ich sie online aufrufe gehts aber.
    Die UDF hab ich dann auf NOT FENCED geändert und jetzt läuft es wieder.

    Im Internet lese ich aber Horrormeldungen dass NOT FENCED UDFs die Datenbank zum crashen bringen können.

    Eine FENCED UDF wird in einem eigenen Thread ausgeführt, die NOT FENCED nicht, oder hab ich da was falsch verstanden?

    Mir ist nicht klar warum die UDF als FENCED abstürzt wenn das Serviceprogramm ACTGRP(*CALLER) hat.

    Hat da jemand Erfahrungen damit??

    Mfg Peter
    Wer andren eine Bratwurst brät, hat ein Bratwurstbratgerät!

  2. #2
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Hallo Peter,

    Richtig: bei fenced arbeitet die function in einem seperatem thread.
    bei not fenced nicht. dies kann zur performance-optimierung verwendet werden, da kein eigener thread erstellt werden muss.
    jedoch muss bei not fenced darauf geachtet werden, dass beim arbeiten mit cursor keine überschneidungen stattfinden, da bei not fenced der cursor offen bleiben kann und es darf der name cursor in der UDF nicht gleich sein wie im PGM welches das UDF aufruft.

    mein tipp: not fenced NUR verwenden, wenn in der function nicht mit cursor gearbeitet wird.

    lg andreas

  3. #3
    Registriert seit
    Sep 2004
    Beiträge
    129
    Cursor ist keiner in der UDF, aber ich versteh nicht warum die Funktion abstürzt wenn ich FENCED, das ja default ist, benutze.
    Es wird einfach aus einem Table ein Feld ausgelesen, das sollte ja nicht allzu kompliziert sein.

    Ich hab prinzipiell kein Problem damit die UDF mit NOT FENCED zu erstellen, aber das "warum" interessiert mich sehr.
    Wer andren eine Bratwurst brät, hat ein Bratwurstbratgerät!

  4. #4
    Registriert seit
    Aug 2003
    Beiträge
    1.508
    Zitat Zitat von dabeda Beitrag anzeigen
    ... stürzt die UDF mit Bomben und Granaten ab ...
    kannst du die genaue fehlermeldung posten?

  5. #5
    Registriert seit
    Aug 2001
    Beiträge
    2.875
    m.E. ist das Problem die Aktivierungsgruppe *CALLER (mit einer benannten Aktivierungsgruppe hat es ja funktioniert!). Wenn die Funktion in einem eigenen Thread aufgerufen wird, gibt es in diesem Thread keine rufende Aktivierungsgruppe.
    Die Overrides u.ä. führen in einem separaten Thread ebenfalls zu Problemen. RPG ist nun mal nicht Thread Safe!

    Versuch mal das folgene:
    Füge in die H-Bestimmungen das Schlüsselwort Thread(*SERIALIZE) ein. Dies sollte bewirken, dass in einer multi-threaded Umgebung kein neuer Thread eröffnet wird und die Funktion im gleichen Thread läuft.
    Die Funktion anschließend wieder mit FENCED registrieren und ausprobieren.

    Birgitta
    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

  6. #6
    Registriert seit
    Sep 2004
    Beiträge
    129
    Werde das heute gleich mal testen.
    Das Problem ist, dass in diesem Serviceprogramm viele Prozeduren drinnen sind, hoffe nur es wirkt sich sonst auf keine aus. Sind aber alle RPG und eben nur diese eine SQL.

    @andreas
    Die Fehlermeldung hab ich nicht mehr, finde nur mehr einen Satz im Joblog: "Der Symptomzeichenfolge wurde ein ungültiges Symptom hinzugefügt". Hört sich an wie beim Arzt ...
    Wer andren eine Bratwurst brät, hat ein Bratwurstbratgerät!

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.246
    Daher sollte man SQL-Functions/Proceduren in einem Service-Programm nicht mit anderen Nicht-SQL-Prozeduren mischen.

    Gliedere die Funktion besser in ein eigenes Serviceprogramm aus.
    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
    Sep 2004
    Beiträge
    129
    So, hab das jetzt versucht mit THREAD(*SERIALIZE) aber das wars nicht. Wieder ein Absturz der UDF.
    Die Maschine behauptet "Zeiger für angegebene Position nicht gesetzt", aber es sind alle Parameter gefüllt.
    Habs mir im Debugmodus angeschaut, sobald die Funktion aufgerufen wird crashed das Programm und nimmt gleich noch alles im Aufrufstapel mit.

    Nochmal der Ablauf:

    In der Kundenstammwartung wird auf den Kundenstamm geschrieben, ein Trigger wird ausgelöst, darin wird mittels SQL-Cursor eine Datei gelesen in der die aufzurufenden Triggerprogramme stehen. Das erste Programm wird aufgerufen und sieht in einer Steuerungsdatei nach ob gewissen Dinge zu tun sind oder nicht. Das geschieht mittels eines Prozeduraufrufs an ein Serviceprogramm das wiederum eine UDF enthält die die Datei liest und den gewünschten Wert zurückgibt.

    Da die UDF in anderen Programmen, Views und dergleichen auch genutzt wird, dort aber direkt angesprochen wird, macht mir das schon Kopfzerbrechen wenn ich NOT FENCED angeben muß. Weiß ja nicht wie sich das auswirken kann.
    Wer andren eine Bratwurst brät, hat ein Bratwurstbratgerät!

  9. #9
    Registriert seit
    Sep 2004
    Beiträge
    129
    Also laut IBM Handbuch ist NOT FENCED nur ein Vorschlag an die Datenbank, die dann wieder selbst entscheidet ob es auch so gemacht wird.
    Denke ich lass das jetzt mal so laufen und beobachte es ein bißchen.
    Wer andren eine Bratwurst brät, hat ein Bratwurstbratgerät!

  10. #10
    Registriert seit
    Feb 2001
    Beiträge
    20.246
    NOT FENCED ist eine Prozedur/Funktions-Deklaration und wird nur von SQL verwendet.
    Rufst du eine Servicefunktion native auf, interressiert sich keiner für diese Deklaration.

    Wichtig ist halt nur die ACTGRP.
    Ich habe mir daher ein 2-stufiges Konzept angewöhnt:
    1. SQL-Funktion/Prozedure in eigenem Programm als reiner Rahmen
    2. Aufruf der verarbeitenden OPM/ILE-Programme über Schnittstellen
    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. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL UDF Function ausführung mit Fehler
    By jakarto in forum IBM i Hauptforum
    Antworten: 2
    Letzter Beitrag: 24-07-06, 13:41
  3. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  4. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43
  5. SQL - Problem
    By muadeep in forum IBM i Hauptforum
    Antworten: 6
    Letzter Beitrag: 27-07-05, 15:17

Berechtigungen

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