Domanda

Qual è il modo migliore per fare l'equivalente semantico di tradizionale sleep() chiamata di sistema dall'interno di un Informix SPL di routine?In altre parole, una semplice "pausa" per N secondi (o millisecondi o qualsiasi altra cosa, ma i secondi sono ottimi).Sto cercando una soluzione che non non richiede il collegamento di alcune nuove (forse scritti da me) codice C o in un'altra libreria in server Informix.Questo deve essere qualcosa che posso fare puramente da SPL.Una soluzione per gli ID di 10 o 11 andrebbe bene.

@RET - La "ovvia" la risposta non era ovvio per me!Non conoscevo il comando di SISTEMA.Grazie!(E sì, io sono il ragazzo che si pensi che io sia.)


Sì, è solo per scopi di debug.Purtroppo, la CORRENTE all'interno di un SPL restituisce sempre lo stesso valore, impostare la voce per la chiamata:

"qualsiasi chiamata CORRENTE all'interno del SPL funzione che una FUNZIONE EXECUTE (o ESEGUIRE la PROCEDURA) istruzione richiama restituisce il valore dell'orologio di sistema quando l'SPL funzione di avvio."

IBM Informix Guida a SQL

Avvolgere CORRENTE nella propria subroutine non aiuta.Si ottiene una risposta diversa, in prima convocazione per il wrapper (se si sta usando ANNO DI FRAZIONE(5) o qualche altro tipo con una risoluzione abbastanza elevata per mostrare la differenza), ma poi si ottenere lo stesso valore di ogni singola chiamata successiva, che assicura che qualsiasi tipo di ciclo non terminerà mai.

È stato utile?

Soluzione

Ci deve essere un buon motivo per non volere la risposta più ovvia:SYSTEM "sleep 5".Se tutto quello che stai volendo è per l'SPL per mettere in pausa durante il controllo di vari valori, ecc, qui ci sono un paio di pensieri (che sono tutti di assoluta hack, ovviamente):

  1. Rendere il FILE di TRACCIA di una named pipe (supponendo Unix back-end), in modo che blocca fino a quando si sceglie di lettura, o di
  2. Creare un'altra tabella che il tuo SPL urne per una particolare voce di un ciclo WHILE, e inserire la riga detto altrove (terribilmente inefficiente)
  3. Fare IMPOSTARE la MODALITÀ di BLOCCO del tuo amico:eseguire il comando "SET di BLOCCO in MODALITÀ DI ATTESA n" e deliberatamente requery un tavolo a cui siete già in possesso di un cursore aperto su.Avrete bisogno di avvolgere questo in un gestore di ECCEZIONI, naturalmente.

Spero che sia di qualche aiuto (e se tu sei lo stesso JS di Ars e Rose::DB fama, è il minimo che potevo fare ;-)

Altri suggerimenti

Presumo che si desidera che questa "pausa" per scopi di debug, in caso contrario penso, avrai sempre un po ' meglio i compiti da fare per il vostro server di sonno ...

Un suggerimento:Forse si potrebbe ottenere CORRENTE, aggiungere un paio di secondi ( che mytimestamp ) quindi in un ciclo while selezionare CORRENTE, mentre la CORRENTE <= mytimestamp .Non ho informix installazione intorno alla mia scrivania per provare, quindi dovrete figura la sintassi corretta.Di nuovo, non mettere un hack su un server di produzione.Siete stati avvertiti :D

Quindi dovrete ordito CORRENTE in un'altra funzione che verrà chiamata dalla prima (ma questo è un hack sul precedente hack ...).

Sono consapevole che la risposta è troppo tardi.Tuttavia recentemente ho riscontrato lo stesso problema e questo sito mostra come il primo.Quindi è utile per altre persone per rispondere qui.

Perfetta soluzione è stata trovata da Eric Herber e pubblicato nel mese di aprile 2012 qui: Come dormire (o rendimento), per un tempo determinato in una stored procedure Purtroppo questo sito è giù.

La sua soluzione è utilizzare la seguente funzione:

integer sysadmin:yieldn( integer nseconds )
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top