2

有没有办法通过语言预定义的常量或函数来确定 pls_integer 的最大可能值?我可以在互联网上找到最大值 (2^31 - 1 = 2,147,483,647),但我不想硬编码。

干杯:)

4

2 回答 2

2

我不认为这是可能的。为什么?因为它不是必需的 -PLS_INTEGER's最大值是由于它的最大大小 - 4 个字节(并且它是有符号数据类型)。

更重要的是,正如有关 PL/SQL 数据类型的文档中所述,PLS_INTEGER实际上是一个BINARY_INTEGER. 查看PLS_INTEGEROracle的STANDARD包中的定义:

subtype pls_integer is binary_integer;

然后看一下 的定义BINARY_INTEGER

subtype BINARY_INTEGER is INTEGER range '-2147483647'..2147483647;

STANDARD包头中,您找不到保存这些数据类型最大值的常量。

于 2013-10-24T17:20:41.367 回答
2

我认为没有任何常数可以使用;但是,如果不对任何值进行硬编码非常重要,您可以使用下面给出的方法计算最大值。

该解决方案基于最大值为 2^b-1 形式的假设,其中 b 是位数。

这是您可以使用的功能:

CREATE FUNCTION MAX_PLS_INTEGER_SIZE RETURN PLS_INTEGER AS 
  p PLS_INTEGER;
  b NUMBER;
BEGIN
  b := 0;
  WHILE TRUE LOOP
    BEGIN
      p := POWER(2, b)-1;

      b := b + 1;
      EXCEPTION WHEN OTHERS THEN
        EXIT;
    END; 
  END LOOP;

  RETURN p;
end;

创建函数后,您可以对其进行测试:

SELECT MAX_PLS_INTEGER_SIZE FROM DUAL;

结果:

MAX_PLS_INTEGER_SIZE
--------------------
2147483647
于 2013-10-24T17:52:08.643 回答