質問

従来の sleep() システム コールと同等の意味を Informix SPL ルーチン内から実行する最善の方法は何でしょうか?言い換えれば、単純に N 秒間 (またはミリ秒など、秒単位でも問題ありません) の間「一時停止」します。それを解決する解決策を探しています ない 新しい (おそらく私が書いた) C コードまたは他のライブラリを Informix サーバーにリンクする必要があります。これは純粋に SPL からできることでなければなりません。IDS 10 または 11 用のソリューションは問題ありません。

@RET - 「明白な」答えは私には明らかではありませんでした。SYSTEMコマンドについては知りませんでした。ありがとう!(そして、はい、私はあなたが思っているような男です。)


はい、これはデバッグ目的のみです。残念ながら、SPL 内の CURRENT は常に同じ値を返し、呼び出しの入り口で設定されます。

「EXECUTE FUNCTION (または EXECUTE PROCEDURE) ステートメントが呼び出す SPL 関数内からの CURRENT への呼び出しは、SPL 関数の開始時にシステム クロックの値を返します。」

IBM Informix SQL ガイド

CURRENT を独自のサブルーチンでラップしても役に立ちません。ラッパーへの最初の呼び出しでは異なる答えが得られますが(YEAR TO FRACTION(5) または違いを示すのに十分な解像度を持つ他の型を使用している場合)、その後はすべての呼び出しで同じ値が返されます。後続の呼び出しにより、いかなる種類のループも終了しないことが保証されます。

役に立ちましたか?

解決

明白な答えを望まないのには、何らかの正当な理由があるはずです。SYSTEM "sleep 5". 。さまざまな値などをチェックしている間、SPL を一時停止したいだけである場合は、次のような考えがあります (もちろん、すべて完全なハックです)。

  1. TRACE FILE を名前付きパイプ (Unix バックエンドを想定) にして、そこからの読み取りを選択するまでブロックするようにします。
  2. SPL が WHILE ループから特定のエントリをポーリングする別のテーブルを作成し、その行を別の場所から挿入します (非常に非効率です)
  3. SET LOCK MODE を友達にしましょう:「SET LOCK MODE TO WAIT n」を実行し、すでにカーソルを開いているテーブルを意図的に再クエリします。もちろん、これを EXCEPTION ハンドラーでラップする必要があります。

それが何らかの助けになれば幸いです (そして、もしあなたが Ars と Rose::DB で有名な同じ JS なら、それが私にできる最低限のことです ;-)

他のヒント

デバッグ目的でこの「一時停止」が必要だと思いますが、そうでない場合は、サーバーに対してスリープよりも優れたタスクを常に実行する必要があることを考えてください...

提案:おそらく、 CURRENT を取得し、それを数秒追加して( mytimestamp にする)、 while ループで CURRENT while CURRENT <= mytimestamp を選択することができます。私のデスクにはそれを試すための Informix セットアップがないので、正しい構文を理解する必要があります。繰り返しますが、そのようなハッキングを運用サーバーに行わないでください。警告されました:D

次に、最初から呼び出す別の関数で CURRENT をワープする必要があります (ただし、これは前のハックのハックです...)。

答えが遅すぎることは承知しています。ただし、最近同じ問題に遭遇し、このサイトが最初の問題として表示されます。したがって、他の人がここに新しい回答を配置することは有益です。

完璧な解決策は Eric Herber によって発見され、2012 年 4 月にここで公開されました。 ストアド プロシージャで一定時間スリープ (またはイールド) する方法残念ながら、このサイトは閉鎖されています。

彼の解決策は、次の関数を使用することです。

integer sysadmin:yieldn( integer nseconds )
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top