Question

Quelle est la meilleure façon de faire l'équivalent sémantique de l'appel système sleep() traditionnel à partir d'une routine Informix SPL ?En d'autres termes, faites simplement une "pause" pendant N secondes (ou millisecondes ou autre, mais les secondes suffisent).Je cherche une solution qui fait pas implique de lier un nouveau code C (peut-être écrit par moi) ou une autre bibliothèque au serveur Informix.Cela doit être quelque chose que je peux faire uniquement à partir de SPL.Une solution pour IDS 10 ou 11 conviendrait.

@RET - La réponse "évidente" n'était pas évidente pour moi !Je ne connaissais pas la commande SYSTEM.Merci!(Et oui, je suis le gars que vous pensez que je suis.)


Oui, c'est uniquement à des fins de débogage.Malheureusement, CURRENT au sein d'un SPL renverra toujours la même valeur, définie à l'entrée de l'appel :

"tout appel à CURRENT depuis l'intérieur de la fonction SPL invoqué par une instruction EXECUTE FUNCTION (ou EXECUTE PROCEDURE) renvoie la valeur de l'horloge système au démarrage de la fonction SPL."

Guide IBM Informix sur SQL

Envelopper CURRENT dans son propre sous-programme n'aide pas.Vous obtenez une réponse différente lors du premier appel à votre wrapper (à condition que vous utilisiez YEAR TO FRACTION(5) ou un autre type avec une résolution suffisamment élevée pour montrer la différence), mais vous obtenez ensuite la même valeur à chaque fois. appel ultérieur, qui garantit que toute sorte de boucle ne se terminera jamais.

Était-ce utile?

La solution

Il doit y avoir une bonne raison pour laquelle vous ne voulez pas la réponse évidente :SYSTEM "sleep 5".Si tout ce que vous souhaitez, c'est que le SPL fasse une pause pendant que vous vérifiez diverses valeurs, etc., voici quelques réflexions (qui sont toutes de véritables hacks, bien sûr) :

  1. Faites du TRACE FILE un tube nommé (en supposant un back-end Unix), afin qu'il se bloque jusqu'à ce que vous choisissiez de le lire, ou
  2. Créez une autre table que votre SPL interroge pour une entrée particulière à partir d'une boucle WHILE et insérez ladite ligne depuis un autre endroit (horriblement inefficace)
  3. Faites de SET LOCK MODE votre ami :exécutez "SET LOCK MODE TO WAIT n" et réinterrogez délibérément une table sur laquelle vous maintenez déjà un curseur ouvert.Vous devrez bien sûr envelopper cela dans un gestionnaire EXCEPTION.

J'espère que cela vous aidera (et si vous êtes le même JS d'Ars et Rose::DB, c'est le moins que je puisse faire ;-)

Autres conseils

Je suppose que vous souhaitez cette "pause" à des fins de débogage, sinon pensez-y, vous aurez toujours de meilleures tâches à faire pour votre serveur que de dormir...

Une suggestion:Peut-être pourriez-vous obtenir CURRENT, l'ajouter quelques secondes (laisser mytimestamp) puis dans une boucle while sélectionner CURRENT while CURRENT <= mytimestamp .Je n'ai pas de configuration informix sur mon bureau pour l'essayer, vous devrez donc trouver la syntaxe correcte.Encore une fois, ne mettez pas un tel hack sur un serveur de production.Vous êtes prévenu :D

Ensuite vous devrez déformer CURRENT dans une autre fonction que vous appellerez dès la première (mais c'est un hack du hack précédent...).

Je suis conscient que la réponse est trop tard.Cependant, j'ai récemment rencontré le même problème et ce site apparaît comme le premier.Il est donc avantageux pour d'autres personnes de placer une nouvelle réponse ici.

La solution parfaite a été trouvée par Eric Herber et publiée en avril 2012 ici : Comment dormir (ou céder) pendant une durée fixe dans une procédure stockéeMalheureusement, ce site est en panne.

Sa solution consiste à utiliser la fonction suivante :

integer sysadmin:yieldn( integer nseconds )
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top