Возможно ли индексировать коллекцию с индексами больше 3 млрд?

Пример рабочего кода:

declare
  type a is table of number index by pls_integer;
  b a;
begin
  b(1) := 5;
end;

Но тогда нельзя написать b(3000000000), т.к. этот индекс далеко за пределами pls_integer, а нужно использовать больше 2.1 млрд. Можно переделать в index by varchar2, но это повышает время выполнения запросов процентов на 30.

index by number не работает:

declare
  type a is table of number index by number;
  b a;
begin
  b(1) := 5;
end;

Error report -
ORA-06550: line 2, column 13:
PLS-00315: Implementation restriction: unsupported table index type

Есть ли путь использовать числовую индексацию больше 2.1млрд?

Элементов в массиве при этом не так много.


Ответы (1 шт):

Автор решения: 0xdb

Нет, нельзя превысить лимит BINARY_INTEGER|PLS_INTEGER (-2147483648 до 2147483647).

Ркомендуемый обходной путь решения - преобразование в VARCHAR2 с функцией TO_CHAR:

You can populate an element of the associative array with a value of any type that can be converted to VARCHAR2 with the TO_CHAR function

Так будет самое эффективное решение:

declare 
    type numlist is table of number index by varchar (12);
    idx number := 3e9; 
    nl numlist;
begin
    nl(to_char (idx)) := idx;
    dbms_output.put_line ('nl('||idx||') = '||nl(to_char (idx)));
end;
/

nl(3000000000) = 3000000000
→ Ссылка