在OceanBase 数据库的 PL 数据类型中, PLS_INTEGER 和 BINARY_INTEGER 是相同的。

    PLS_INTEGER 存储有符号的整数,范围从 -2,147,483,648 到 2,147,483,647, 占用 32 个字节。和 number 类型相比,PLS_INTEGER 在存储上占用更少的空间,计算上更高效。

    如果两个 PLS_INTEGER 类型的计算结果超出了 PLS_INTEGER 的取值范围,数据库会报错。如果数据大小超出 PLS_INTEGER范围,需要替换成内置类型 INTEGER。如下例所示,即使最终是赋值给 NUMBER 类型的变量,仍旧会报错。

    1. obclient> DECLARE
    2. -> num1 PLS_INTEGER := 2147483647;
    3. -> num2 PLS_INTEGER := 1;
    4. -> total NUMBER;
    5. -> BEGIN
    6. -> total := num1 + num2;
    7. -> DBMS_OUTPUT.PUT_LINE(total);
    8. -> END;
    9. -> /
    10. ORA-01426: numeric overflow

    解决办法是把至少其中一个变量替换成 INTEGER,如下例所示:

    1. obclient> DECLARE
    2. -> num1 PLS_INTEGER := 2147483647;
    3. -> num2 INTEGER := 1;
    4. -> total NUMBER;
    5. -> BEGIN
    6. -> total := num1 + num2;
    7. -> DBMS_OUTPUT.PUT_LINE(total);
    8. -> END;
    9. -> /
    10. Query OK, 0 rows affected (0.02 sec)
    11. 2147483648