Ошибка числового переполнения в индексе в Oracle - PullRequest
0 голосов
/ 03 декабря 2018

Я написал небольшой фрагмент кода ниже, чтобы продемонстрировать, в чем именно заключается проблема, с которой я сталкиваюсь.

DECLARE
   TYPE a IS RECORD (a1 NUMBER);

   TYPE b IS TABLE OF a
      INDEX BY BINARY_INTEGER;

   f   b;
BEGIN
   DBMS_OUTPUT.PUT_LINE ('Begin');
   f (1).a1 := 1;
   f (2).a1 := 2;
   f (2147483647).a1 := 3;
   DBMS_OUTPUT.put_line ('2147483647');
   f (2147483648).a1 := 4;
   DBMS_OUTPUT.put_line ('2147483648');
END;

* Получение следующей ошибки при выполнении кода выше ORA-01426: числовое переполнение ORA-06512: в строке 14

Здесь строка № 14: f (2147483648) .a1: = 4;

*

Я получаю 'переполнение чисел'ошибка для индекса, который я использую.Oracle позволяет мне иметь индекс до 2147483647 (который является не чем иным, как 2 ^ 31), но если я превышаю это значение, я получаю ошибку «числового переполнения».Есть ли способ ее решить?В моем коде мне нужно индексирование, которое пересекает значение 4653474078

1 Ответ

0 голосов
/ 03 декабря 2018

Нельзя превышать максимально допустимый предел, если вы используете BINARY_INTEGER в качестве типа индекса для вашего ассоциативного массива.Одним из обходных путей может быть использование строковых (VARCHAR2) индексов путем кавычек этих чисел или использования TO_CHAR.

SET SERVEROUTPUT ON
DECLARE
     TYPE a IS RECORD ( a1  NUMBER );
     TYPE b IS
          TABLE OF a INDEX BY VARCHAR2(12); --upto 12 digit index
     f            b;
     v_bigindex   NUMBER := 4653474078;
BEGIN
     f('2147483648').a1 := 3;
     f(TO_CHAR(v_bigindex )).a1 := 4;

     dbms_output.put_line('Index = '   || 2147483648 || 
                         ' element = ' || f('2147483648').a1
                         );
     dbms_output.put_line('Index = '   || v_bigindex || 
                         ' element = ' || f(v_bigindex).a1
                         );
END;
/


Index = 2147483648 element = 3
Index = 4653474078 element = 4


PL/SQL procedure successfully completed.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...