Ajungeți la o procedură Informix SPL

Care este cel mai bun mod de a face echivalentul semantic al apelului sistem tradițional de somn() dintr-o rutină Informix SPL? Cu alte cuvinte, pur și simplu "pauză" pentru N secunde (sau milisecunde sau orice, dar secundele sunt bine). Căut o soluție care nu implică legarea unui nou cod (C) sau a unei alte biblioteci în serverul Informix. Acest lucru trebuie să fie ceva ce pot face numai din SPL. O soluție pentru IDS 10 sau 11 ar fi bine.

@RET - Răspunsul "evident" nu mi-a fost evident! Nu știam despre comanda SYSTEM. Mulțumesc! (Și da, eu sunt tipul pe care crezi că sunt.)


Da, este doar pentru scopuri de depanare. Din păcate, CURRENT într-un SPL va întoarce întotdeauna aceeași valoare, setată la intrarea în apel:

"any call to CURRENT from inside the SPL function that an EXECUTE FUNCTION (or EXECUTE PROCEDURE) statement invokes returns the value of the system clock when the SPL function starts."

IBM Informix Guide to SQL

Împachetarea CURRENT în propria sa subrutină nu vă ajută. Veți primi un răspuns diferit la primul apel al ambalajului dvs. (cu condiția să utilizați ANUL DE FRACȚIE (5) sau alt tip cu o rezoluție suficient de mare pentru a arăta diferența), dar apoi obțineți aceeași valoare înapoi pe fiecare ulterior, ceea ce asigură că orice tip de bucla nu se va termina niciodată.

0
fr hi bn

3 răspunsuri

Trebuie să existe un motiv bun pentru care nu doriți răspunsul evident: SYSTEM "sleep 5" . Dacă tot ce doriți este ca SPL să întrerupă în timp ce verificați diferite valori etc, iată câteva gânduri (toate acestea sunt, desigur, hack-uri):

  1. Faceți TRACE FILE o conductă numită (presupunând un back-end Unix), așa că blochează până când alegeți să citiți din ea sau
  2. Creați un alt tabel pe care SPL-ul dvs. îl cheamă pentru o anumită intrare dintr-o buclă WHILE și introduceți rândul respectiv din altă parte (oribil ineficient)
  3. Faceți SET LOCK MODE prietenul tău: executați "SET LOCK MODE TO WAIT n" și cereți în mod deliberat o masă pe care deja o țineți un cursor deschis. Va trebui să înfășurați acest lucru într-o procedură de EXCEPTION, bineînțeles.

Sper că este un ajutor (și dacă ești același JS de Ars și Rose :: DB faima, e cel mai puțin pe care aș putea să o fac ;-)

0
adăugat

Presupun că doriți această "pauză" pentru scopuri de depanare, altfel gândiți-vă, veți avea mereu niște sarcini mai bune de făcut pentru server decât să dormiți ...

A suggestion: Maybe you could get CURRENT, add it a few seconds ( let mytimestamp ) then in a while loop select CURRENT while CURRENT <= mytimestamp . I've no informix setup around my desk to try it, so you'll have to figure the correct syntax. Again, do not put such a hack on a production server. You've been warned :D

0
adăugat
CURRENT nu se modifică în timp ce se execută instrucțiunea SQL de nivel superior. Există un DBINFO() care face - și există informații în sysmaster care o face.
adăugat autor Jonathan Leffler, sursa

Apoi va trebui să răsuciți CURRENT într-o altă funcție pe care o veți apela de la prima (dar aceasta este o hack pe hack-ul anterior ...).

0
adăugat