4

Informix SPL ルーチン内から従来の sleep() システム コールと同等のセマンティックを実行する最善の方法は何ですか? 言い換えれば、単純に 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) または違いを表示するのに十分な解像度を持つ他のタイプを使用している場合)、すべての単一で同じ値が返されますこれにより、いかなる種類のループも終了しないことが保証されます。

4

4 に答える 4

2

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

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

それが助けになることを願っています(そして、あなたがArsとRose :: DBの名声の同じJSであるなら、それは私ができる最低のことです;-)

于 2008-09-17T05:45:52.350 に答える
0

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

提案:おそらく、CURRENTを取得し、それを数秒追加して(mytimestampを許可)、whileループでCURRENT while CURRENT<=mytimestampを選択します。机の周りにinformixを設定して試していないので、正しい構文を理解する必要があります。繰り返しになりますが、本番サーバーにそのようなハッキングを加えないでください。あなたは警告されました:D

于 2008-08-10T16:58:39.887 に答える
0

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

于 2008-08-11T08:43:31.583 に答える