3

Appworx というプロセス スケジューリング ソフトウェアを使用しています。その中で、各プロセスとサブプロセスは、任意の数の「条件」を持つことができます。これが真の場合、何らかの条件付きアクションが実行されます。

可能な条件付きアクションの 1 つは goto ステートメントです。この場合、単純な整数がラベルになります (各条件には 1 から始まる番号が付けられます)。この機能を使用して、ループ内のいくつかのタスクを評価して実行したいと思いますが、番号が大きい条件にしか移動できません (理由は聞かないでください...これにより、ほとんどのユーティリティが台無しになるようです)。

これらすべてがバックエンドでオラクルによって評価されると信じるに足る理由があります。Appworx のスキーマを見ると、gotoラベルはすべて NUMBER(12,0) であることがわかります。ラベルが現在の状態よりも低いかどうかをチェックするロジックは、次のようなものだと思います。

where label > current_condition

したがって、goto に十分に高い値を指定すると、チェックが不正になり、単純なループを実行できるようになると思います。少なくともOracleが通常の整数を使用した場合。それらをオーバーフローさせることは可能ですか? また、値をオーバーフローさせて 1 に戻すにはどの値を使用しますか?

Oracle のバージョンはかなり重要だと思います。もしそうなら、それは 11g です。

PSまた、誰かが私のためにこれを再タグ付けしたい場合は、「appworx」を追加してください

4

2 に答える 2

3

Oracle の数値は、実際には 10 進数 40 桁の浮動小数点数です。
したがって、オーバーフローすることはできません。

(10^ 40-1 ) は、1 を増やすことができる最大の整数です。

NUMBER(12,0) は、タイプ NUMBER のサブタイプです。
つまり、NUMBER 型と制限チェッカーで構成されます。

于 2013-03-18T19:07:44.413 に答える
2

まあ、それは「オーバーフロー」の定義に依存します。「オーバーフロー」を「 n + 1 < nの値nを見つける」と定義する、いいえ、そのような値はありません。「オーバーフロー」を「例外を発生させる」と定義すると、例外が発生する NUMBER(12,0) に対して操作を実行することは十分に可能です。

以下を実行します。

DECLARE
  n  NUMBER(12, 0);
BEGIN
  n := 999999999999;  -- Twelve 9's
  DBMS_OUTPUT.PUT_LINE('1 : n=' || n);
  n := n + 1;
  DBMS_OUTPUT.PUT_LINE('2 : n=' || n);
EXCEPTION
  WHEN OTHERS THEN
    DBMS_OUTPUT.PUT_LINE('Exception: ' || SQLCODE || '  ' || SQLERRM);
END;

ご覧のとおり、「n := n + 1」を実行しようとすると、次の例外がスローされます。

ORA-06502: PL/SQL: numeric or value error: number precision too large

したがって、NUMBER のサブタイプがオーバーフローする可能性は十分にあります。ただし、 n + 1 < nの値nを見つけたいと考えていることを考える、運が悪いと思います。

そして、基本の NUMBER 型を使用してこの動作を本当に引き起こしたい場合は、単に実行します

n := POWER(10, 126);

もちろん、NUMBER で本当に厄介な動作を行うには、NaN (数値ではない) を生成する必要があります。

n := 9999999999999999999999999999999999999999 * POWER(10, 125);
DBMS_OUTPUT.PUT_LINE('n=' || n);

生産する

n=~

なんてこと?!? '~'? 「~」って一体何?これは、NaN を出力する Oracle の方法のようです。そして、本当に楽しい部分は?変数に NaN を取得すると、その変数に対して実行する操作によって別の NaN が生成されます。静かに。静かに。警告なしに。頼りなく。試す:

DBMS_OUTPUT.PUT_LINE('n * 1234=' || n * 1234);  -- produces n * 1234=~
DBMS_OUTPUT.PUT_LINE('n / 5678=' || n / 5678);  -- produces n / 5678=~

おい - あなたの財政に汗を流して楽しんでください!:-)

実際には、このような行動に出くわす可能性はほとんどありませんが、本当に注意する必要があるのは、このようなことです。これに遭遇すると、その月が本当に台無しになる可能性があるだけでなく、次の週に (そしてこれを期待できるからです)。バスルームの立方体にいる無知な男がこれについて尋ねようとしています-そしてあなたは今それについてすべて知っています. (そして、この男は本当に無知であり、地獄からの立方体に駐車するに値することを知って、安心して休むことができます。つまり、StackOverflowでこれを取り上げましたよね? :-)

共有してお楽しみください。

于 2013-03-20T18:26:47.573 に答える