【发布时间】:2012-06-01 09:24:16
【问题描述】:
您知道如何在 Oracle PL/SQL 中模拟 32 位整数溢出吗? 例如,
2147483647 + 1 = -2147483648
或
-2147483648 - 1 = 212147483647
我尝试了 PLS_INTEGER,但它引发了溢出异常。
【问题讨论】:
标签: oracle plsql integer integer-overflow
您知道如何在 Oracle PL/SQL 中模拟 32 位整数溢出吗? 例如,
2147483647 + 1 = -2147483648
或
-2147483648 - 1 = 212147483647
我尝试了 PLS_INTEGER,但它引发了溢出异常。
【问题讨论】:
标签: oracle plsql integer integer-overflow
我终于找到了一种方法。假设N 是NUMBER 类型的值,您需要以某种方式模拟32 位有符号整数溢出,然后:
N := MOD(N, 4294967296);
IF N > 2147483647
THEN
N := N - 4294967296;
ELSIF N < -2147483648
THEN
N := N + 4294967296;
END IF;
【讨论】:
也许你可以捕获溢出异常,如下所示:
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;
分享和享受。
【讨论】:
在Oracle中模拟32位有符号溢出有一个更优雅的单行解决方案:
N := MOD (N - 2147483647, 4294967296) + 2147483647;
N 的类型为 NUMBER 或 INTEGER。
【讨论】: