【问题标题】:How to simulate 32-bit signed integer overflow in PL/SQL?如何在 PL/SQL 中模拟 32 位有符号整数溢出?
【发布时间】:2012-06-01 09:24:16
【问题描述】:

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

2147483647 + 1 = -2147483648

-2147483648 - 1 = 212147483647

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

【问题讨论】:

    标签: oracle plsql integer integer-overflow


    【解决方案1】:

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

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

    【讨论】:

      【解决方案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;
      

      分享和享受。

      【讨论】:

        【解决方案3】:

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

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

        N 的类型为 NUMBERINTEGER

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-08-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-06-11
          • 1970-01-01
          • 2014-02-09
          相关资源
          最近更新 更多