在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 类型的变量,仍旧会报错。
obclient> DECLARE
-> num1 PLS_INTEGER := 2147483647;
-> num2 PLS_INTEGER := 1;
-> total NUMBER;
-> BEGIN
-> total := num1 + num2;
-> DBMS_OUTPUT.PUT_LINE(total);
-> END;
-> /
ORA-01426: numeric overflow
解决办法是把至少其中一个变量替换成 INTEGER,如下例所示:
obclient> DECLARE
-> num1 PLS_INTEGER := 2147483647;
-> num2 INTEGER := 1;
-> total NUMBER;
-> BEGIN
-> total := num1 + num2;
-> DBMS_OUTPUT.PUT_LINE(total);
-> END;
-> /
Query OK, 0 rows affected (0.02 sec)
2147483648