Frage

Was ist der beste Weg, das semantische Äquivalent des herkömmlichen Systemaufrufs „sleep()“ innerhalb einer Informix-SPL-Routine auszuführen?Mit anderen Worten: „Pause“ einfach für N Sekunden (oder Millisekunden oder was auch immer, aber Sekunden sind in Ordnung).Ich suche nach einer Lösung, die das tut nicht Dazu gehört das Verknüpfen eines neuen (vielleicht von mir geschriebenen) C-Codes oder einer anderen Bibliothek mit dem Informix-Server.Das muss etwas sein, was ich rein aus SPL heraus tun kann.Eine Lösung für IDS 10 oder 11 wäre in Ordnung.

@RET – Die „offensichtliche“ Antwort war für mich nicht offensichtlich!Ich wusste nichts über den SYSTEM-Befehl.Danke schön!(Und ja, ich bin der Typ, für den Sie mich halten.)


Ja, es dient nur zu Debugzwecken.Leider gibt CURRENT innerhalb einer SPL immer denselben Wert zurück, der am Eingang des Aufrufs festgelegt wurde:

„Jeder Aufruf von CURRENT innerhalb der SPL-Funktion, den eine EXECUTE FUNCTION- (oder EXECUTE PROCEDURE)-Anweisung aufruft, gibt den Wert der Systemuhr zurück, wenn die SPL-Funktion startet.“

IBM Informix-Handbuch zu SQL

Es hilft nicht, CURRENT in eine eigene Unterroutine einzuschließen.Beim ersten Aufruf Ihres Wrappers erhalten Sie zwar eine andere Antwort (vorausgesetzt, Sie verwenden YEAR TO FRACTION(5) oder einen anderen Typ mit ausreichend hoher Auflösung, um den Unterschied anzuzeigen), aber dann erhalten Sie bei jedem einzelnen Aufruf den gleichen Wert zurück Folgeaufruf, der sicherstellt, dass jede Art von Schleife niemals beendet wird.

War es hilfreich?

Lösung

Es muss einen guten Grund geben, warum Sie die offensichtliche Antwort nicht wollen:SYSTEM "sleep 5".Wenn Sie nur möchten, dass der SPL pausiert, während Sie verschiedene Werte usw. überprüfen, finden Sie hier ein paar Gedanken (die natürlich allesamt reine Tricks sind):

  1. Machen Sie die TRACE-DATEI zu einer benannten Pipe (unter der Annahme eines Unix-Backends), sodass sie blockiert, bis Sie sich entscheiden, daraus zu lesen, oder
  2. Erstellen Sie eine weitere Tabelle, die Ihre SPL nach einem bestimmten Eintrag aus einer WHILE-Schleife abfragt, und fügen Sie diese Zeile an einer anderen Stelle ein (furchtbar ineffizient).
  3. Machen Sie SET LOCK MODE zu Ihrem Freund:Führen Sie „SET LOCK MODE TO WAIT n“ aus und fragen Sie absichtlich eine Tabelle erneut ab, auf der Sie bereits einen Cursor geöffnet halten.Sie müssen dies natürlich in einen EXCEPTION-Handler einbinden.

Ich hoffe, das hilft etwas (und wenn Sie derselbe JS von Ars und Rose::DB sind, ist das das Mindeste, was ich tun kann ;-)

Andere Tipps

Ich gehe davon aus, dass Sie diese „Pause“ zu Debugging-Zwecken wünschen, ansonsten denken Sie darüber nach, Sie werden für Ihren Server immer einige bessere Aufgaben zu erledigen haben als den Ruhezustand ...

Ein Vorschlag:Vielleicht könnten Sie CURRENT erhalten, ein paar Sekunden hinzufügen (lassen Sie mytimestamp ) und dann in einer while-Schleife CURRENT auswählen, während CURRENT <= mytimestamp .Ich habe kein Informix-Setup an meinem Schreibtisch, um es auszuprobieren, daher müssen Sie die richtige Syntax herausfinden.Auch hier gilt: Führen Sie einen solchen Hack nicht auf einem Produktionsserver durch.Du wurdest gewarnt :D

Dann müssen Sie CURRENT in einer anderen Funktion verzerren, die Sie von Anfang an aufrufen (aber dies ist ein Hack des vorherigen Hacks ...).

Mir ist bewusst, dass die Antwort zu spät ist.Allerdings bin ich kürzlich auf das gleiche Problem gestoßen und diese Seite wird als erste angezeigt.Daher ist es für andere von Vorteil, hier neue Antworten zu platzieren.

Die perfekte Lösung wurde von Eric Herber gefunden und im April 2012 hier veröffentlicht: Wie man in einer gespeicherten Prozedur für eine bestimmte Zeit schläft (oder nachgibt).Leider ist diese Seite nicht verfügbar.

Seine Lösung besteht darin, die folgende Funktion zu verwenden:

integer sysadmin:yieldn( integer nseconds )
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top