Pergunta

Qual é a melhor maneira de fazer o equivalente semântico da chamada de sistema sleep() tradicional de dentro de uma rotina SPL do Informix?Em outras palavras, simplesmente "pause" por N segundos (ou milissegundos ou qualquer outra coisa, mas segundos estão bem).Estou procurando uma solução que faça não envolve vincular algum código C novo (talvez escrito por mim) ou outra biblioteca ao servidor Informix.Isso deve ser algo que eu possa fazer exclusivamente com SPL.Uma solução para IDS 10 ou 11 seria adequada.

@RET - A resposta "óbvia" não era óbvia para mim!Eu não sabia sobre o comando SYSTEM.Obrigado!(E sim, sou o cara que você pensa que sou.)


Sim, é apenas para fins de depuração.Infelizmente, CURRENT dentro de uma SPL sempre retornará o mesmo valor, definido na entrada da chamada:

"qualquer chamada para CURRENT de dentro da função SPL que uma instrução EXECUTE FUNCTION (ou EXECUTE PROCEDURE) invoca retorna o valor do relógio do sistema quando a função SPL é iniciada."

Guia IBM Informix para SQL

Envolver CURRENT em sua própria sub-rotina não ajuda.Você obtém uma resposta diferente na primeira chamada para o seu wrapper (desde que esteja usando YEAR TO FRACTION(5) ou algum outro tipo com resolução alta o suficiente para mostrar a diferença), mas então você obtém o mesmo valor de volta em cada chamada subsequente, o que garante que qualquer tipo de loop nunca terminará.

Foi útil?

Solução

Deve haver algum bom motivo para você não querer a resposta óbvia:SYSTEM "sleep 5".Se tudo o que você deseja é que o SPL faça uma pausa enquanto você verifica vários valores, etc., aqui estão algumas idéias (todas elas são hacks completos, é claro):

  1. Faça do TRACE FILE um canal nomeado (assumindo o back-end do Unix), para que ele seja bloqueado até que você opte por lê-lo, ou
  2. Crie outra tabela que seu SPL pesquise para uma entrada específica de um loop WHILE e insira a referida linha de outro lugar (terrivelmente ineficiente)
  3. Faça do SET LOCK MODE seu amigo:execute "SET LOCK MODE TO WAIT n" e consulte deliberadamente uma tabela na qual você já está mantendo o cursor aberto.Você precisará agrupar isso em um manipulador EXCEPTION, é claro.

Espero que tenha ajudado (e se você é o mesmo JS of Ars e Rose::DB fama, é o mínimo que posso fazer ;-)

Outras dicas

Presumo que você queira essa "pausa" para fins de depuração, caso contrário, pense bem, você sempre terá algumas tarefas melhores para fazer no seu servidor do que dormir...

Uma sugestão:Talvez você possa obter CURRENT, adicioná-lo por alguns segundos (deixe mytimestamp ) e, em um loop while, selecione CURRENT while CURRENT <= mytimestamp .Não tenho nenhum Informix configurado em minha mesa para testá-lo, então você terá que descobrir a sintaxe correta.Novamente, não coloque tal hack em um servidor de produção.Você foi avisado :D

Então você terá que distorcer CURRENT em outra função que você chamará desde a primeira (mas isso é um hack do hack anterior...).

Estou ciente de que a resposta é tarde demais.No entanto, recentemente encontrei o mesmo problema e este site aparece como o primeiro.Portanto, é benéfico para outras pessoas colocarem novas respostas aqui.

A solução perfeita foi encontrada por Eric Herber e publicada em abril de 2012 aqui: Como dormir (ou ceder) por um tempo fixo em um procedimento armazenadoInfelizmente este site está fora do ar.

Sua solução é usar a seguinte função:

integer sysadmin:yieldn( integer nseconds )
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top