まあ、それは「オーバーフロー」の定義に依存します。「オーバーフロー」を「 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でこれを取り上げましたよね? :-)
共有してお楽しみください。