如何模拟PL / SQL中的32位有符号整数溢出?

时间:2012-06-01 09:24:16

标签: oracle plsql integer integer-overflow

您知道如何在Oracle PL / SQL中模拟32位整数溢出。 例如,

2147483647 + 1 = -2147483648

-2147483648 - 1 = 212147483647

我尝试了PLS_INTEGER,但它抛出了溢出异常。

3 个答案:

答案 0 :(得分:2)

也许您可以捕获溢出异常,如下所示:

DECLARE 
  n PLS_INTEGER;
  addend PLS_INTEGER;

  NUMERIC_OVERFLOW EXCEPTION;
  PRAGMA EXCEPTION_INIT(NUMERIC_OVERFLOW, -1426);
BEGIN
  n := 2147483642;
  addend := 6;

  BEGIN  
    n := n + addend;
  EXCEPTION
    WHEN NUMERIC_OVERFLOW THEN
      DBMS_OUTPUT.PUT_LINE('OVERFLOW!');
      n := -2147483647 + (-2147483647 + n + addend - 1);

    WHEN OTHERS THEN
      DBMS_OUTPUT.PUT_LINE('SQLCODE=' || SQLCODE || '  ' || SQLERRM);
  END;

  DBMS_OUTPUT.PUT_LINE(n);
END;

分享并享受。

答案 1 :(得分:2)

我终于找到了办法。假设NNUMBER类型的值,您需要以某种方式模拟32位有符号整数溢出,然后:

N := MOD(N, 4294967296);
IF N > 2147483647
THEN
    N := N - 4294967296;
ELSIF N < -2147483648
THEN
    N := N + 4294967296;
END IF;

答案 2 :(得分:0)

在 Oracle 中有一种更优雅的单行解决方案来模拟 32 位有符号溢出:

N := MOD (N - 2147483647, 4294967296) + 2147483647;

N 的类型为 NUMBERINTEGER