Pl sql numeric or value error character string buffer too small перевод

Вы можете получить сообщение об ошибке, указывающее, что мой буфер строки ошибок ora-06502 pl / sql слишком мал. Есть несколько способов решить эту проблему, и мы скоро разберемся с приложением. ...

Вы можете получить сообщение об ошибке, указывающее, что мой буфер строки ошибок ora-06502 pl / sql слишком мал. Есть несколько способов решить эту проблему, и мы скоро разберемся с приложением.

Рекомендуется

  • 1. Скачать ASR Pro
  • 2. Следуйте инструкциям на экране, чтобы запустить сканирование.
  • 3. Перезагрузите компьютер и подождите, пока он завершит сканирование, а затем снова следуйте инструкциям на экране, чтобы удалить все вирусы, обнаруженные при сканировании компьютера с кодом ASR Pro.
  • Ускорьте свой компьютер сегодня с помощью этой простой в использовании загрузки. г.

    ORA-06502: Числовая ошибка PL / SQL, с другой стороны, количественная ошибка: слишком маленький буфер символьной строки. Ошибка возникает, когда символьная строка длиннее по сравнению с объявленной температурной переменной. Длина каждой строки не должна превышать размер нашего собственного типа данных, объявленного в переменной.

    ORA-06502: Числовая или значимая ошибка PL / SQL: слишком маленький числовой буфер. Ошибки возникают, когда расстояние строки местоположения превышает длину, относящуюся к этой конкретной объявленной символьной переменной. Разрыв строки не должен превышать размер типа захвата, объявленного в переменной.

    Я тестировал все следующие различные методы кода, такие как удаление while и as well if, но когда я обслуживаю их вместе (if и while), я все равно получаю сообщение об ошибке с обоих концов …

    p >

      номера справкиВключить вывод на серверNumero принимает причину «Введите № от 110 до 999:»Объяснять   I число: равно 1;  знак (25);   udemrrrket Dynamics (1);   c varchar2 (10);   телефонный номер ;начинать   Цельсия: = & число;   d: подразумевает длину (c);   j: = подстрока (c, i, 1);   написания цикла <= d     если b = '1', то       a: = сказочный || 'а';     Конец, если;     я: = я + 1;   Приемная петля;   dbms_output.put_line ('Счетчик равен' || a);Конец;/ 
      ORA-06502: PL или SQL: числовое значение или просто ошибка: буфер символьного цикла слишком малORA-06512: на линии 1306502.00000 "PL на SQL: числовое значение или значение ошибки% s" зона 
      a varchar2 (2000); 

    * Обратите внимание, что основное изменение здесь — это работа VARCHAR2 вместо CHAR (не самая длинная временная длина). Согласно ответу @ user272735, это всегда было каждым ключом.

    ORA-06502: PL / SQL: число или ошибка: слишком мала строка strm. Ошибка возникает, если длина выполнения строки символов намного дороже, чем длина объявленного регулируемого стиля. Значение не может быть присвоено переменной should, если размер значения, передаваемого с базой данных, превышает размер этой объявленной переменной. ORA-06502: PL / SQL: числовые, с другой стороны. Ошибка: строковый буфер со слишком маленьким значением, как правило, будет возвращен oracle. Эта ошибка возникает из-за того, что распознание вывода, хранящееся в этой переменной, длиннее, чем было объявлено.

    Длина вашей текущей строки не должна превышать машину того типа данных, который объявлен для изменения. В этом конкретном случае строку часто можно сохранить в переменной. Если длина призрачной марки превышает указанный размер смещения, кабель больше нельзя будет сохранить. Если выполняется проверка для присвоения атрибутов апелляции, создается исключение.

    Исключение

    Ошибка описывается следующим образом. Номер выбора указывает на ошибку. Длина данных вместе с переменной больше, чем длина значения. Следующая ошибка произошла недавно.

    Объявить

         void varchar2 (3);начинать    пустой: = 'A101';Конец;Указатели ошибок -ORA-06502: числовой pl / sql: или ошибка цены: буфер строки духа слишком малORA-06512: строка 406502.00000 1. "PL / SQL: значение слишком числовая ошибка% s"  

    В трассировке стека ошибок можно увидеть две ошибки ORA. Рядом с вероятностью ошибки отображается первое предприятие с ошибкой. Вторая ошибка кода указывает, в какой строке обычно возникает ошибка. Ошибка свидетельствует о том, что размер строки деталей, учитываемых при анализе, больше не соответствует присвоенному ей значению.

    Проблема

    Рекомендуется

    Ваш компьютер работает медленно? У вас проблемы с запуском Windows? Не отчаивайтесь! ASR Pro — это решение для вас. Этот мощный и простой в использовании инструмент проведет диагностику и ремонт вашего ПК, повысит производительность системы, оптимизирует память и повысит безопасность процесса. Так что не ждите — скачайте ASR Pro сегодня!

  • 1. Скачать ASR Pro
  • 2. Следуйте инструкциям на экране, чтобы запустить сканирование.
  • 3. Перезагрузите компьютер и подождите, пока он завершит сканирование, а затем снова следуйте инструкциям на экране, чтобы удалить все вирусы, обнаруженные при сканировании компьютера с кодом ASR Pro.
  • Невозможно описать строку, если она намного длиннее, чем тип размера объявленной переменной веб-типа данных. В этом случае ошибка может повториться. Источник статистики пытается присвоить строку, чтобы убедиться, что вы указали номер. Будет выдана ошибка, если вы посчитаете, что строка содержит больше времени, чем ширина переменной.

    ora-06502. Буфер строки запроса на ошибку pl / sql слишком мал

    В следующей затруднительной ситуации важны четыре личности. В частности, переменная объявляется длиной в три символа. Длина строкового значения превышает размер типа объявленной переменной. ORA-06502: Ошибка PL / SQL: ошибка числа или значения: буфер строки роли мал, все равно будет отображаться, если значение привело к небольшой переменной.

    Объявить

         void varchar2 (3);начинать     = пусто 'A101';Конец ;  

    до свидания

    Объявить

         бесполезный varchar2 (3);начинать    : = освободить 'A101';Конец;Страница ошибки -ORA-06502: PL / SQL: числовая ошибка или ошибка цены арены: строковый буфер слишком малORA-06512: на шпагате 406502.00000 3. PL / SQL: числовое значение или значение ошибки% s " 

    Причина

    Произошла математическая, числовая, строковая, преобразовательная ошибка или, возможно, ошибка ограничения. Например, конкретная ошибка возникает, когда вы пытаетесь установить NULL, чтобы получить хорошую переменную, объявленную как NON NULL, или когда вы пытаетесь использовать внешние бюро для целого числа больше 99, чтобы помочь вам идентифицировать переменную с помощью NUMBER (2) оператор.

    Действие

    Измените степень детализации, то, как она обрабатывается или как лучше всего ее объявить, чтобы сокровище определенно нарушало ограничения.

    Уникальное решение

    Часть значения, переданного в Oracle PS./SQL, превышает размер, указанный для уникального символьного типа поиска. Чтобы воспользоваться этим, необходимо изменить тип типа данных. Общий вид символьного типа данных должен быть лучше. Если я хочу, чтобы размер моего дизайна данных репутации был максимальным, добавленным к типу данных, следует использовать другую сортировку диска, чтобы удовлетворить большую любовь.

    Объявить

         обнулить varchar2 (4);начинать    пусто: = 'A101';Конец . . .  

    выход

      Процедура PL / SQL успешно завершена.  

    Двойное решение

    Очень важно стать широко известным благодаря ценному содержанию PL / SQL. Возможно, значение переменной было авторизовано некорректно и даже в одном методе произошла ошибка. После исправления значение be, безусловно, можно сохранить в переменной.

    Объявить

         varchar2 (4);начинать empid empid: указывает на «101»;Конец ;  

    выход

    ora-06502 pl / sql error character string load too small

      Процедура PL / SQL успешно выполнена.  

    Решение 3

    Во многих случаях присвоенное значение находится в определенном диапазоне объявленного типа данных. Размер значения регулярно достигает заявленного расстояния и ширины типа данных. В типичной ситуации мы не можем регулировать размер всех типов данных. Упущение необходимо исправить, а затем учесть в коде PL / SQL.

    Объявить

        обнулить varchar2 (3);начинать    пусто: = 'A101';исключение    ЕСЛИ ДРУГОЕ, ТО        пустой: = 0;Конец . . .  

    выход

    ora-06502 слишком маленький буфер строки аспекта ошибки pl / sql

      Транзакция PL / SQL завершена успешно.  

    Ускорьте свой компьютер сегодня с помощью этой простой в использовании загрузки. г.

    Сделайте так, чтобы вы могли SQL Designer (Инструменты / Настройки / База данных для NLS). Замените его на «СИМВОЛ». Как вы наверняка увидите, после изменения параметра плохие направляющие необходимо перекомпилировать, чтобы они стали «CHAR». Чтобы проверить, скомпилированы ли другие пакеты некорректно, воспользуйтесь этим запросом.

    Как исправить ошибку ORA-06502?

    Изменение числового значения на правильный диапазон цифр человека или изменение перехода на другой диапазон цифр, чтобы соответствовать значению, активирует ORA-06502.

    Как исправить слишком маленький буфер числовой строки PL SQL, а также символьной строки ошибки значения?

    Перейдите в помощь SQL Developer (Инструменты / Настройки / База данных и NLS). Замените его на «СИМВОЛ». Чтобы исправить эту конкретную основную проблему, вам необходимо перекомпилировать поврежденные пакеты после изменения конфигурации, чтобы убедиться, что у вас есть «CHAR». Чтобы увидеть, были ли другие инструменты скомпилированы неправильно, запустите этот раздел.

    Ora 06502 Pl Sql Error Character String Buffer Too Small
    Ora 06502 Pl Sql Error Zeichenkettenpuffer Zu Klein
    Ora 06502 Buffer Della Stringa Di Caratteri Di Errore Pl Sql Troppo Piccolo
    Ora 06502 Pl Sql Erreur Tampon De Chaine De Caracteres Trop Petit
    Ora 06502 Pl Sql Fout Karakter String Buffer Te Klein
    Ora 06502 Pl Sql Fel Teckenstrangbuffert For Liten
    Ora 06502 Pl Sql Erro De Caracteres String Buffer Muito Pequeno
    Ora 06502 Pl Sql 오류 문자열 버퍼가 너무 작습니다
    Ora 06502 Pl Sql Bufer De Cadena De Caracteres De Error Demasiado Pequeno
    Ora 06502 Blad Pl Sql Bufor Ciagu Znakow Za Maly

    г.

    Об этой ошибке: ORA-06502: числовая или значимая ошибка

     FOR this_loop IN (SELECT field_A, field_B FROM TABLE_NAME WHERE num = i_num) LOOP IF this_loop.field_B BETWEEN 1 AND 3 THEN v_A := v_A || ' ' || this_loop.field_A; ELSIF this_loop.field_B BETWEEN 4 AND 8 THEN v_field_A := v_field_A || ' ' || this_loop.field_A; -- Error is at this line ELSIF this_loop.field_B BETWEEN 9 AND 15 THEN v_B := v_B || ' ' || this_loop.field_A; END IF; END LOOP; 

    Переменная обозначается как

    v_field_A VARCHAR2 (100); 

    Что я знаю —

    1. Переменная v_field_A не может содержать значение более 100 символов.
    2. Результат, который я получаю от SELECT Запрос не может содержать более 10 символов.

    Мой вопрос — как вообще можно решить эту проблему с пространственным буфером, когда символы находятся в пределах лимита varchar2? Я столкнулся с этой проблемой несколько лет назад, но в прошлый раз причиной был выход select запрос. В нем было более 100 символов, и, следовательно, проблема с размером, но на этот раз не более 10 символов. Я в замешательстве. Любая помощь приветствуется

    • сколько строк у вас в таблице?
    • Есть более миллиона строк, но это происходит только с несколькими строками.
    • Чтобы быть более конкретным, сколько строк извлекает цикл? 10 символов * 11 итераций цикла == вы столкнетесь с ошибкой, так как вы продолжаете конкатенировать значение переменной на каждой итерации
    • почему нельзя увеличить размер v_field_A? это решит проблему
    • @ Сатья Это зависит от обстоятельств. Обычно это не более 3-4 рядов.

    Переменная v_field_A не может содержать значение более 100 символов.

    Почему нет? Это очень возможно, так как вы сцепление переменная для каждой строки в КУРСОР ДЛЯ ПЕТЛИ.

    Например,

    SQL> DECLARE 2 v_name VARCHAR2(50); 3 BEGIN 4 FOR i IN 5 (SELECT ename FROM emp 6 ) 7 LOOP 8 v_name := v_name || i.ename; 9 END LOOP; 10 END; 11 / DECLARE * ERROR at line 1: ORA-06502: PL/SQL: numeric or value error: character string buffer too small ORA-06512: at line 8 

    Использовать DBMS_OUTPUT чтобы увидеть текущий размер переменной и добавляемое новое значение.

    Давайте отладим

    SQL> DECLARE 2 v_name VARCHAR2(50); 3 BEGIN 4 FOR i IN 5 (SELECT ename FROM emp 6 ) 7 LOOP 8 dbms_output.put_line('Length of new value = '||LENGTH(i.ename)); 9 v_name := v_name || i.ename; 10 dbms_output.put_line('Length of variable = '||LENGTH(v_name)); 11 END LOOP; 12 END; 13 / Length of new value = 5 Length of variable = 5 Length of new value = 5 Length of variable = 10 Length of new value = 4 Length of variable = 14 Length of new value = 5 Length of variable = 19 Length of new value = 6 Length of variable = 25 Length of new value = 5 Length of variable = 30 Length of new value = 5 Length of variable = 35 Length of new value = 5 Length of variable = 40 Length of new value = 4 Length of variable = 44 Length of new value = 6 Length of variable = 50 Length of new value = 5 

    ошибка

    DECLARE * ERROR at line 1: ORA-06502: PL/SQL: numeric or value error: character string buffer too small ORA-06512: at line 9 

    Это довольно ясно, мы хотели объединить строку длиной 5 к переменной, объявленной как максимальный размер 50, в настоящее время хранит значение размера 50. следовательно, он выдает ошибку ORA-06502: PL/SQL: numeric or value error: character string buffer too small.

    • Поправьте меня если я ошибаюсь. если переменная может содержать более 50 или 100 символов. Проблема размера не должна существовать вовсе, верно?
    • @PirateX Вы забываете тот факт, что вы объединяете значения в переменную в цикле, поэтому в какой-то момент при итерации по косякам он превышает заявленный размер. Я добавил в свой ответ пример.
    • Хорошо, я думаю, что у меня есть идея. Это конкатенация, которая в какой-то момент превышает предел 100, вызывая ошибку. Правильно ?
    • @PirateX Совершенно верно. Это то, что вы видите в DBMS_OUTPUT в примере, который я вам показал.
    • @PirateX Пожалуйста, отметьте это как ответ, помогло бы и другим! Я вижу, что ни один из ваших вопросов никогда не был отмечен как отвеченный. Это хороший жест, и сообщество предлагает принять ответ, который решит вашу проблему. Удачи!

    11 строк * 10 символов> 100 символов => ошибка — вы объединяете много строк по 10 символов вместе в одну из трех переменных. Один из них будет расти каждый раз в цикле.

    Что мне не хватает?

    Также остерегайтесь символов вместо байтов. В varchar2 каждый CHARACTER, вероятно, займет 2 байта.

    Проверьте, сколько раз это условие выполняется и какие значения объединяются. Поскольку это объединяется несколько раз, существует вероятность того, что размер v_field_A превышает 50 символов.

    ELSIF this_loop.field_B BETWEEN 4 AND 8 THEN v_field_A := v_field_A || ' ' || this_loop.field_A; 

    Чтобы решить эту проблему, вы можете увеличить размер этой переменной. Вы можете объявить varchar размером до 32 767 байт

    Вы можете выполнить конкатенацию строк в SQL-запросе:

    SELECT field_A, LISTAGG(CASE WHEN field_B BETWEEN 1 AND 3 THEN field_A END, ' ') WITHIN GROUP (ORDER BY field_A) as val1, LISTAGG(CASE WHEN field_B BETWEEN 4 AND 8 THEN field_A END, ' ') WITHIN GROUP (ORDER BY field_A) as val2, LISTAGG(CASE WHEN field_B BETWEEN 9 AND 15 THEN field_A END, ' ') WITHIN GROUP (ORDER BY field_A) as val3 FROM TABLE_NAME WHERE num = i_num; 

    Это сделано для упрощения вашего кода. Вы по-прежнему ограничены длиной строки Oracle. Вы можете обойти ограничение Oracle в PL / SQL с помощью CLOB, но в этом нет необходимости, если конечная строка состоит всего из нескольких сотен символов.

    • 2 Даже LISTAGG имеет Ограничение SQL из 4000.

    Ответ на ваш вопрос заключается в том, сколько раз цикл выполняется и сколько раз он входит в условие IF.

    ПРИМЕР :

    Состояние : МЕЖДУ 4 А ТАКЖЕ 8

    this_loop.field_A: = ‘тест’;

    Количество выполнений цикла = 100

    Из-за КОНКАТИНАЦИЯ размер определенно вырастет более чем на 100 символов.

    То же самое будет и с другими условиями LOOP.

    Решение : Попробуйте использовать CLOB вместо того VARCHAR чтобы устранить эту проблему.

    Ошибки Oracle очень наглядны. Если он вызывает ошибку, это в значительной степени объясняет сценарий: P.

    Tweet

    Share

    Link

    Plus

    Send

    Send

    Pin

     
    SergP ©
     
    (2006-11-13 13:04)
    [0]

    В чем может быть причина такой ошибки?

    ORA-06502: PL/SQL: numeric or value error: character string buffer too small

    И где можно увеличить этот character string buffer?


     
    Sergey13 ©
     
    (2006-11-13 13:10)
    [1]

    ORA-06502 PL/SQL: numeric or value errorstring

    An arithmetic, numeric, string, conversion, or constraint error occurred. For example, this error occurs if an attempt is made to assign the value NULL to a variable declared NOT NULL, or if an attempt is made to assign an integer larger than 99 to a variable declared NUMBER(2).

    Change the data, how it is manipulated, or how it is declared so that values do not violate constraints.


     
    Desdechado ©
     
    (2006-11-13 13:14)
    [2]

    s VARCHAR2(10):=»123456789012345″;


     
    SergP ©
     
    (2006-11-13 13:27)
    [3]

    Понял…
    Теперь как бы найти в каком месте это происходит, а то процедура большая, а в логе выводится только номер строки где raise стоит…


    ...
      EXCEPTION
         WHEN OTHERS
         THEN
            RAISE;
      END;


     
    Sergey13 ©
     
    (2006-11-13 13:30)
    [4]

    > [3] SergP ©   (13.11.06 13:27)

    В PL/SQL Developere например есть отладчик процедур.


     
    Desdechado ©
     
    (2006-11-13 13:32)
    [5]

    смысл такого
    EXCEPTION
        WHEN OTHERS
        THEN
           RAISE;
     END;

    обработчика?
    без него тебе бы и строку показало


     
    ANB ©
     
    (2006-11-13 13:34)
    [6]


    > SergP ©   (13.11.06 13:27) [3]

    Хех. Известный косяк. Сохраняй на всех перехватах исключений ее трассировку. так сможешь найти место ошибки. И сделай все варчаровые переменные подлиннее. Оракл сильно от этого не напряжется. Кстати, возможный вариант, из-за чего может появится ошибка :
    имеем S varchar2(10). S := «Вася123456»; На 10-ке (XE) вполне вероятна ошибка невлезания, т.к. русские буквы занимают по 2 байта. Лечится заменой varchar2(10) на varchar2(10 char)


     
    SergP ©
     
    (2006-11-13 13:49)
    [7]

    Спасибо… Убрал этот обработчик и нашел где…


     
    Desdechado ©
     
    (2006-11-13 13:52)
    [8]

    > русские буквы занимают по 2 байта
    Это если NVARCHAR2 пытаться туда запихнуть. Или нет?


     
    SergP ©
     
    (2006-11-13 14:01)
    [9]

    > [8] Desdechado ©   (13.11.06 13:52)
    > > русские буквы занимают по 2 байта
    > Это если NVARCHAR2 пытаться туда запихнуть. Или нет?

    там оказалось что не с русскими буквами связано, а с цифрами…
    видимо число не влазило в

    v_n_reg_sa         VARCHAR2 (20)  := NULL;

    увеличил на глаз до 24. Теперь работает.


     
    ANB ©
     
    (2006-11-13 14:15)
    [10]


    > Это если NVARCHAR2 пытаться туда запихнуть. Или нет?

    Не. Просто константу. Причем на 9-ке с этим проблем не было.


     
    SergP ©
     
    (2006-11-13 15:24)
    [11]

    > [9] SergP ©   (13.11.06 14:01)
    >
    > увеличил на глаз до 24. Теперь работает.

    Блин. Разработчики редиски… Сегодня прислали версию, вместо той что раньше прислали… Посмотрел, а они там уже сами увеличили размеры переменных. А я часа 1,5-2 потратил на поиск этих «багов»….


     
    Desdechado ©
     
    (2006-11-13 16:09)
    [12]

    разработчиков [5] — строем за метлами

    > Не. Просто константу. Причем на 9-ке с этим проблем не было.
    В какой кодировке создавалась БД? В какой кодировке схема? Может, умолчания изменились?


     
    k2 ©
     
    (2006-11-13 16:12)
    [13]

    Desdechado ©   (13.11.06 16:09) [12]
    для nls_length_semantics умолчание изменилось вроде:
    в 9-ке-char, в 10-ке-byte


     
    ANB ©
     
    (2006-11-13 16:13)
    [14]


    > Desdechado ©   (13.11.06 16:09) [12]

    ЭЭЭЭ. Просто пнули XE она сама все поставила. Не задавая лишних вопросов. Хотя, в принципе, указание размерности никому не мешает, зато код будет работать при любой настройке базы.


     
    Игорь Шевченко ©
     
    (2006-11-13 16:26)
    [15]


    > Хотя, в принципе, указание размерности никому не мешает,
    >  зато код будет работать при любой настройке базы.

    А вот гады пишут, что лучше nls_length_semantics устанавливать, а саму семантику в объявлениях только при крайней нужде менять. Оно говорят портабельнее получается. Домены бы в Оракл — цены б ему не было.


     
    Desdechado ©
     
    (2006-11-13 16:32)
    [16]

    Да, доменов мне не хватает…

    k2 ©   (13.11.06 16:12) [13]
    На своей 9-ке проверил (умолчания не трогали) — BYTE. И на линухе, и на выни.


     
    k2 ©
     
    (2006-11-13 16:35)
    [17]

    Desdechado ©   (13.11.06 16:32) [16]
    знач наврала сорри, у меня это запросто :)


     
    ANB ©
     
    (2006-11-13 16:43)
    [18]


    > Desdechado ©   (13.11.06 16:32) [16]

    Не, это из-за кодировки. Почему то в XE по дефолту полуторнобайтовая кодировка врублена (не помню как она называется, однако dump хорошо это показывает).


     
    Игорь Шевченко ©
     
    (2006-11-13 17:21)
    [19]

    ANB ©   (13.11.06 16:43) [18]


    > Почему то в XE по дефолту полуторнобайтовая кодировка врублена

    А это я вполне могу вечером посмотреть, стоит XE с кодировкой по умолчанию. XE юникодный (XEUniv)


     
    Игорь Шевченко ©
     
    (2006-11-13 22:55)
    [20]

    В XE без всяких исправлений, как было, так и встало.

    NLS_LANGUAGE               AMERICAN

          NLS_TERRITORY              AMERICA

              NLS_CURRENCY               $      

                                      NLS_ISO_CURRENCY           AMERICA

             NLS_NUMERIC_CHARACTERS     .,    

              NLS_CHARACTERSET           AL32UTF8

              NLS_CALENDAR               GREGORIAN

              NLS_DATE_FORMAT            DD-MON-RR

              NLS_DATE_LANGUAGE          AMERICAN

              NLS_SORT                   BINARY

              NLS_TIME_FORMAT            HH.MI.SSXFF AM

              NLS_TIMESTAMP_FORMAT       DD-MON-RR HH.MI.SSXFF AM

              NLS_TIME_TZ_FORMAT         HH.MI.SSXFF AM TZR

              NLS_TIMESTAMP_TZ_FORMAT    DD-MON-RR HH.MI.SSXFF AM TZR

              NLS_DUAL_CURRENCY          $

              NLS_COMP                   BINARY

              NLS_LENGTH_SEMANTICS       BYTE

              NLS_NCHAR_CONV_EXCP        FALSE

              NLS_NCHAR_CHARACTERSET     AL16UTF16

              NLS_RDBMS_VERSION          10.2.0.1.0


     
    ANB ©
     
    (2006-11-14 10:37)
    [21]

    NLS_CHARACTERSET           AL32UTF8
    NLS_LENGTH_SEMANTICS       BYTE
    NLS_NCHAR_CHARACTERSET     AL16UTF16

    Вот эти параметры намекают мне, что у тебя по идее должна быть такая же проблема, если явно не указать размерность char


     
    Игорь Шевченко ©
     
    (2006-11-14 11:09)
    [22]

    ANB ©   (14.11.06 10:37) [21]


    > Вот эти параметры намекают мне, что у тебя по идее должна
    > быть такая же проблема, если явно не указать размерность
    > char

    Безусловно. Я указываю char в объявлении полей, когда допускаю, что в полях будут находиться символы, отличные от #0-#127, а гады говорят, что надо устанавливать nls_length_semantics для базы, а в объявлениях ничего не трогать.


     
    ANB ©
     
    (2006-11-14 11:18)
    [23]


    > Игорь Шевченко ©   (14.11.06 11:09) [22]

    Уй млин. А мы в базе не стали указывать. Только в хранимках. Хотя я просто все символьные поля, кроме особых случаев, сделал по 4000 байт и забил. Так что по идее влезет все.


     
    ANB ©
     
    (2006-11-14 11:19)
    [24]


    > а гады говорят, что надо устанавливать nls_length_semantics
    > для базы

    А где ты это накопал ?


     
    Игорь Шевченко ©
     
    (2006-11-14 11:45)
    [25]

    ANB ©   (14.11.06 11:18) [23]


    > Хотя я просто все символьные поля, кроме особых случаев,
    >  сделал по 4000 байт и забил. Так что по идее влезет все.
    >

    А если бы лимит в Оракле был на 30000 байт ? :)


    > А где ты это накопал ?

    В доке, вестимо

    «The BYTE and CHAR qualifiers override the semantics specified by the NLS_LENGTH_SEMANTICS parameter, which has a default of byte semantics. For performance reasons, Oracle recommends that you use the NLS_LENGTH_SEMANTICS parameter to set length semantics and that you use the BYTE and CHAR qualifiers only when necessary to override the parameter«

    «Oracle® Database SQL Reference
    10g Release 1 (10.1)
    Part Number B10759-01″


     
    ANB ©
     
    (2006-11-14 11:57)
    [26]


    > А если бы лимит в Оракле был на 30000 байт ? :)

    Ну и сделал бы столько :) На размер БД это не влияет. Они же варчаровые.

    Спасибо за ссылку.


     
    Игорь Шевченко ©
     
    (2006-11-14 12:16)
    [27]


    > Ну и сделал бы столько :) На размер БД это не влияет. Они
    > же варчаровые.

    Наверное ты Celko не читал…А зря, он как раз очень аргументированно возражает против такого бездумного назначения максимального размера полям.
    Рекомендую: http://www.mini-mag.ru/?cid=2170&tov=163372


     
    ANB ©
     
    (2006-11-14 12:20)
    [28]


    > Рекомендую: http://www.mini-mag.ru/?cid=2170&tov=163372

    Тьфу, млин. Это ссылка на магазин.
    Звиняйте — у меня свой авторитет есть :) Тем более он рулил проектом и я у него и спросил — делать так или не надо. Индексы составные поругались поначалу, он размер блока побольше сделал — и всех делов :)


     
    k2 ©
     
    (2006-11-14 12:24)
    [29]

    и мы даже знаем кто :)
    только Селко наверное тож пару раз проектами рулил :)


     
    Игорь Шевченко ©
     
    (2006-11-14 12:59)
    [30]

    ANB ©   (14.11.06 12:20) [28]


    > Звиняйте — у меня свой авторитет есть :) Тем более он рулил
    > проектом и я у него и спросил — делать так или не надо.
    >

    Авторитет авторитету люпус эст.


    > Индексы составные поругались поначалу, он размер блока побольше
    > сделал — и всех делов :)

    Особенно в SQL*Plus удобно запросы с такими полями делать…


     
    ANB ©
     
    (2006-11-14 13:04)
    [31]


    > Особенно в SQL*Plus удобно запросы с такими полями делать.
    > ..

    Я тоадом пользуюсь. он под ширину данных ширину колонки подгоняет


     
    Игорь Шевченко ©
     
    (2006-11-14 13:12)
    [32]

    ANB ©   (14.11.06 13:04) [31]


    > Я тоадом пользуюсь. он под ширину данных ширину колонки
    > подгоняет

    если там пара сотен тысяч записей…

    Кроме того, извини, когда жаба будет поставляться в дистрибутиве оракла, тогда имеет смысл говорить, что ты ей пользуешься и всем рекомендуешь. Тора, она хоть бесплатная, но тормозная, а жаба денег стоит и потому давит.
    Вот и остается SQL*Plus


     
    ANB ©
     
    (2006-11-14 15:48)
    [33]


    > Вот и остается SQL*Plus

    Есть еще pl/sql девелопер, склнафигатор (жуткая гадость).
    А разве жаба платная ?


     
    Игорь Шевченко ©
     
    (2006-11-14 16:18)
    [34]

    ANB ©   (14.11.06 15:48) [33]


    > А разве жаба платная ?

    Вообще-то да. Как и PL/SQL Developer.

    Про жабу интересно написано:
    «The Toad Freeware version may be used for a maximum of five (5) users within Licensee»s organization and expires each sixty (60) days, after which you will need to download and install the product again»
    http://www.toadsoft.com/lic_agree.html

    Насколько я знаю, бесплатная TORA ну и SQL*Plus :)


     
    k2 ©
     
    (2006-11-14 16:40)
    [35]

    ANB ©   (14.11.06 13:04) [31]
    Андрей, а твоя жаба оракловые пакеты понимает на десятке? и какая тогда версия?


     
    Val ©
     
    (2006-11-14 17:02)
    [36]

    >[15] Игорь Шевченко ©   (13.11.06 16:26)
    >..Домены бы в Оракл — цены б ему не было.
    да вроде %TYPE неплохо справляется…


     
    ANB ©
     
    (2006-11-14 17:08)
    [37]


    > Вообще-то да. Как и PL/SQL Developer.

    Млин. А я и не знал. Фришную версию не ставлю — она кривая. А так у меня ключ есть. Пока подходит.


    > Андрей, а твоя жаба оракловые пакеты понимает на десятке?
    >  и какая тогда версия?

    Старая жаба вообще отказалась работать с 10-кой. Ща у меня 8-я версия. Вроде проблем нету особых. Нарывался на глюк в 9-ке — здоровые пакеты с отладкой не хотели компиляться. Пришлось их девелопером компилять.


     
    k2 ©
     
    (2006-11-14 17:20)
    [38]

    у меня 8.0.0.47 категорически отказывается просматривать в 10-ке процедуры , функции и спецификацию пакета, хотя боди и просматривает и редактировать и компилить пожалуйста, такая загогулина :-/


     
    ANB ©
     
    (2006-11-14 17:30)
    [39]


    > k2 ©   (14.11.06 17:20) [38]

    Упс. И у меня такой же. Хотя я на живой 10-ке его не гонял — только на XE. Свежее версии нету ? Вполне возможно, что в этой не выгребли все баги. Таки 7-ка вообще не умела работать с ораклом 10, даже XE.


     
    k2 ©
     
    (2006-11-14 17:36)
    [40]

    у меня 10.2.0.2
    кстати если прихъодилось жабу под mssql-ем гонять пристойно себя ведет?


     
    Игорь Шевченко ©
     
    (2006-11-14 17:42)
    [41]

    k2 ©   (14.11.06 17:20) [38]
    ANB ©   (14.11.06 17:30) [39]

    Кстати фриварная только что скачаная жаба (8.5.0.50g) точно так же не умеет с десяткой работать на предмет процедур/пакетов.
    Что интересно — ТОРА умеет. Но Тора глючная и тормозная.

    Val ©   (14.11.06 17:02) [36]


    > да вроде %TYPE неплохо справляется…

    В какое место в объявлении поля в таблице вставлять %TYPE  ?


     
    k2 ©
     
    (2006-11-14 17:57)
    [42]

    Игорь Шевченко ©   (14.11.06 17:42) [41]
    Oracle Developer немножко знает про домены, после генерации на базе это выглядит как табличка cg_ref_codes (сейчас нет дизайнера, не знаю настраивается) вида:
    CREATE TABLE <Schema>.CG_REF_CODES
    (
     RV_DOMAIN        VARCHAR2(100)                NOT NULL,
     RV_LOW_VALUE     VARCHAR2(240)                NOT NULL,
     RV_HIGH_VALUE    VARCHAR2(240),
     RV_ABBREVIATION  VARCHAR2(240),
     RV_MEANING       VARCHAR2(240),
     RV_TYPE          VARCHAR2(10)
    )
    TABLESPACE USERS
    LOGGING
    NOCACHE
    NOPARALLEL;
    CREATE INDEX <Schema>.X_CG_REF_CODES_1 ON <Schema>.CG_REF_CODES
    (RV_DOMAIN, RV_LOW_VALUE)
    LOGGING
    TABLESPACE <USERS>
    NOPARALLEL;
    DROP SYNONYM SGDEVNU1.CG_REF_CODES;
    CREATE SYNONYM SGDEVNU1.CG_REF_CODES FOR <Schema>.CG_REF_CODES;
    ALTER TABLE <Schema>.CG_REF_CODES ADD (
     CONSTRAINT RV_PK PRIMARY KEY (RV_DOMAIN, RV_LOW_VALUE));
    если это те домены и ничего не попутала :)


     
    Val ©
     
    (2006-11-14 17:57)
    [43]

    >[41] Игорь Шевченко ©   (14.11.06 17:42)
    зачем?


     
    Игорь Шевченко ©
     
    (2006-11-14 18:03)
    [44]

    Val ©   (14.11.06 17:57) [43]


    > зачем?

    Ну чтобы домен был.

    Оно ж как мыслится:

    CREATE DOMAIN DFOO CHAR(3) DEFAULT «BAR» NOT NULL
     CHECK (DFOO IN («BAR», «BAZ», «BOO»));

    а в объявлении таблицы пишешь просто
    CREATE TABLE FOOTABLE (
     ….
     FOO DFOO,
     …
    );


     
    Игорь Шевченко ©
     
    (2006-11-14 18:04)
    [45]

    k2 ©   (14.11.06 17:57) [42]

    То ж небось для самого дизайнера…


     
    Val ©
     
    (2006-11-14 18:06)
    [46]

    >[42] k2 ©   (14.11.06 17:57)
    Здесь под доменом понимается определенный пользователем тип, который может быть и типом поля таблицы. Такого в Оракле пока я не встретил.


     
    Val ©
     
    (2006-11-14 18:22)
    [47]

    >[44] Игорь Шевченко ©   (14.11.06 18:03)
    Ну не знаю… Дело привычки. В ИБ привык, в Оракле затем отвык — оказалось не так уж и нужно мне это в таблицах.


     
    ANB ©
     
    (2006-11-14 18:48)
    [48]


    > Игорь Шевченко ©   (14.11.06 18:04) [45]

    Не. Как то же оракл разрешает создавать поля с объектными типами. Надо просто покопаться.
    Хотя впрямую — да, обломс.


     
    Val ©
     
    (2006-11-14 19:02)
    [49]

    >ANB ©   (14.11.06 18:48)
    поля с объектыми типами? может, таблицы объектного типа?


     
    Desdechado ©
     
    (2006-11-14 19:09)
    [50]

    Val ©   (14.11.06 19:02) [49]
    и поля объектных типов тоже


     
    Val ©
     
    (2006-11-14 19:17)
    [51]

    >[50] Desdechado ©   (14.11.06 19:09)
    речь о вложенных таблицах?


     
    Desdechado ©
     
    (2006-11-14 20:41)
    [52]

    Val ©   (14.11.06 19:17) [51]
    нет, например:
    CREATE TABLE TUNE(
     REGION_ID        NUMBER(10) NOT NULL,
     SDO_MIN_RECT     MDSYS.SDO_GEOMETRY,
     SDO_DIMINFO        MDSYS.SDO_DIM_ARRAY
    );


     
    Игорь Шевченко ©
     
    (2006-11-15 10:27)
    [53]

    Val ©   (14.11.06 18:22) [47]


    > Ну не знаю… Дело привычки. В ИБ привык, в Оракле затем
    > отвык — оказалось не так уж и нужно мне это в таблицах.

    Мне просто лень писать каждый раз одни и те же проверки. И лень потом исправлять во многих местах, если DOMAIN изменился по какой-то причине.


     
    Val ©
     
    (2006-11-15 14:24)
    [54]

    >Desdechado ©   (14.11.06 20:41)
    MDSYS.SDO_GEOMETRY
    и
    MDSYS.SDO_DIM_ARRAY
    не являются таблицами по сути?

    >[53] Игорь Шевченко ©   (15.11.06 10:27)
    С этим я согласен(не зря же домены придуманы), но есть другой нюанс — создавая ограничения руками — вы именуете их как нужно вам, всегда можете ими управлять для конкретной таблицы не трогая других и т.д. Просто разные подходы.


    Я начал получать сообщение об ошибке ниже, так как я добавил o_ID к процедуре, все работало нормально, пока я не добавил в o_IDэто связано с o_ID быть установленным как неправильный тип данных возможно? Я просмотрел любые другие связанные темы на SO, но безрезультатно.

    o_ID изначально устанавливается, как показано ниже PR_LOAD_XML_FILEназывается:

    $id = 0;
    $stmt->bindParam('o_ID', $id);
    

    Из журналов

    2015-12-18T13:02:06+00:00 ERR (3): An exception occurred while executing 'BEGIN PR_LOAD_XML_FILE (
    i_XML => :i_XML,
    i_FILENAME => :i_FILENAME,
    o_ID => :o_ID,
    on_ErrorID => :on_ErrorID
    );
    END;' with params ["<?xml version="1.0" encoding="UTF-8" ?><test><TestDetails><TestVersionId>3244</TestVersionId><Marks>20</Marks></TestDetails></test>", "test.csv"]:
    
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 1
    

    Процедура Spec

    PROCEDURE PR_LOAD_XML_FILE (
    i_XML IN CLOB,
    i_FILENAME IN XML_DOC.FILENAME%TYPE,
    o_ID OUT NUMBER,
    on_ErrorID OUT INTEGER
    );
    

    Тело процедуры

    PROCEDURE PR_LOAD_XML_FILE (
    i_XML IN CLOB,
    i_FILENAME IN XML_DOC.FILENAME%TYPE,
    o_ID OUT NUMBER,
    on_ErrorID OUT INTEGER
    ) IS
    doc_id XML_DOC.id%TYPE;
    xml        XMLTYPE;
    BEGIN
    ...
    END PR_LOAD_XML_FILE;
    

    1

    Решение

    Я думаю, что когда вы вызываете свою процедуру, вы устанавливаете переменную для получения значения o_ID в виде строки. Вот мой пакет, который издевается над твоим:

    CREATE OR REPLACE PACKAGE PKG_PR_LOAD_XML_FILE
    AS
    PROCEDURE PR_LOAD_XML_FILE (
    i_XML IN CLOB,
    i_FILENAME IN varchar2,
    o_ID OUT NUMBER,
    on_ErrorID OUT INTEGER );
    END PKG_PR_LOAD_XML_FILE;
    /
    CREATE OR REPLACE PACKAGE BODY PKG_PR_LOAD_XML_FILE
    AS
    PROCEDURE PR_LOAD_XML_FILE (
    i_XML IN CLOB,
    i_FILENAME IN varchar2,
    o_ID OUT NUMBER,
    on_ErrorID OUT INTEGER )
    IS
    
    BEGIN
    dbms_output.put_line( 'i_XML: '||i_XML );
    dbms_output.put_line( 'i_FILENAME: '||i_FILENAME );
    o_ID := 999999;
    on_ErrorID := 123456789;
    END PR_LOAD_XML_FILE;
    END PKG_PR_LOAD_XML_FILE;
    /
    

    В SQL * Plus я сначала определю эти две переменные связывания. Обратите внимание, что для переменной bind v_o_ID установлено значение varchar2 (4). Это предназначено для потерпеть поражение потому что значение o_ID установлено в 999999 в процедуре, которая длиннее 4 символов (если значение o_ID было установлено равным 9999, что составляет 4 символа или менее, то вызов процедуры работал бы нормально, но ошибка все равно будет присутствовать, и будет появляться Вы, как только значение o_ID станет больше 4 символов):

    SQLPlus> var v_o_ID varchar2(4)
    SQLPlus> var v_on_ErrorID number
    

    Теперь я вызываю процедуру в SQL * Plus, и она будет потерпеть поражение:

    SQLPlus> exec PKG_PR_LOAD_XML_FILE.PR_LOAD_XML_FILE( '<heres my XML>', 'heresfilename.csv', :v_o_ID, :v_on_ErrorID);
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 1
    

    Теперь я установлю переменную связывания v_o_ID в число, и вызов процедуры будет успех. Вы можете увидеть полученные значения из процедуры, если вы печатаете переменные связывания, используя print команда:

    SQLPlus> var v_o_ID number
    
    SQLPlus> exec PKG_PR_LOAD_XML_FILE.PR_LOAD_XML_FILE( '<heres my XML>', 'heresfilename.csv', :v_o_ID, :v_on_ErrorID);
    i_XML: <heres my XML>
    i_FILENAME: heresfilename.csv
    
    PL/SQL procedure successfully completed.
    SQLPlus> print v_o_ID
    V_O_ID
    ----------
    999999
    
    SQLPlus> print v_on_ErrorID
    V_ON_ERRORID
    ------------
    123456789
    

    2

    Другие решения

    Других решений пока нет …

    Содержание

    1. ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    2. Best Answer
    3. Answers
    4. ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    5. Exception
    6. Problem
    7. Output
    8. Cause
    9. Action
    10. Solution 1
    11. Output
    12. Solution 2
    13. Output
    14. Solution 3
    15. How to solve numeric or value error: character string buffer too small?
    16. Answers
    17. Smart way of Technology
    18. Worked in Database technology for fixed the issues faced in daily activities in Oracle, MS SQL Server, MySQL, MariaDB etc.
    19. ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    20. ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    21. Share this:
    22. Like this:
    23. Related
    24. About SandeepSingh DBA
    25. Leave a Reply Cancel reply
    26. ORA-06502: PL/SQL: numeric or value error: character string buffer too smal
    27. Answers

    ORA-06502: PL/SQL: numeric or value error: character string buffer too small

    I am getting a ‘ORA-06502: PL/SQL: numeric or value error: character string buffer too small error’, trying to execute a stored procedure that has an output parameter with all 50 US states and the abbreviations.

    Any suggestions on what I am doing wrong. Oracle database version is 11.2.0.1.0. I am also searching to see if I can find anything online, but thought of asking here in case someone had this problem in the past that was addressed.

    Thank you for the help.

    Best Answer

    And now look at code I posted and compare your

    CD_DESC VARCHAR2(200);

    v_cd_desc varchar2(700); — now it fits

    Answers

    You didn’t show how procedure is called. Most likely OUT actual parameter size is too small:

    SQL> declare

    2 v_cd_desc varchar2(100); — too small

    3 begin

    4 p_state_codes(‘STATES’,v_cd_desc);

    5 end;

    6 /

    declare

    ERROR at line 1:

    ORA-06502: PL/SQL: numeric or value error: character string buffer too small

    ORA-06512: at «SCOTT.P_STATE_CODES», line 11

    ORA-06512: at «SCOTT.P_STATE_CODES», line 11

    ORA-06512: at line 4

    SQL> declare

    2 v_cd_desc varchar2(700); — now it fits

    3 begin

    4 p_state_codes(‘STATES’,v_cd_desc);

    5 end;

    6 /

    PL/SQL procedure successfully completed.

    SQL>

    Getting the error when when was running the stored procedure in SQL Developer and passing STATES as the input parameter.

    Connecting to the database test_11.2.

    ORA-06502: PL/SQL: numeric or value error: character string buffer too small

    ORA-06512: at «KBNIS.P_STATE_CODES», line 11

    ORA-06512: at «KBNIS.P_STATE_CODES», line 11

    ORA-06512: at line 7

    Disconnecting from the database test_11.2.

    However, when I run the same procedure from PL/SQL Developer, it works.

    — Call the procedure

    end;cd_type String STATES

    cd_desc String AL;ALABAMA+AK;ALASKA+AZ;ARIZONA+AR;ARKANSAS+CA;CALIFORNIA+CO;COLORADO+CT;CONNECTICUT+DE;DELAWARE+DC;DISTRICT OF COLUMBIA+FL;FLORIDA+GA;GEORGIA+HI;HAWAII+ID;IDAHO+IL;ILLINOIS+IN;INDIANA+IA;IOWA+KS;KANSAS+KY;KENTUCKY+LA;LOUISIANA+ME;MAINE+MD;MARYLAND+MA;MASSACHUSETTS+MI;MICHIGAN+MN;MINNESOTA+MS;MISSISSIPPI+MO;MISSOURI+MT;MONTANA+NE;NEBRASKA+NV;NEVADA+NH;NEW HAMPSHIRE+NJ;NEW JERSEY+NM;NEW MEXICO+NY;NEW YORK+NC;NORTH CAROLINA+ND;NORTH DAKOTA+OH;OHIO+OK;OKLAHOMA+OR;OREGON+PA;PENNSYLVANIA+RI;RHODE ISLAND+SC;SOUTH CAROLINA+SD;SOUTH DAKOTA+TN;TENNESSEE+TX;TEXAS+UT;UTAH+VT;VERMONT+VA;VIRGINIA+WA;WASHINGTON+WV;WEST VIRGINIA+WI;WISCONSIN+WY;WYOMING+

    Источник

    ORA-06502: PL/SQL: numeric or value error: character string buffer too small

    ORA-06502: PL/SQL: numeric or value error: character string buffer too small error occurs when the length of the character string exceeds the length of the declared character type variable,. The value cannot be assigned to the variable if the size of the value passed in the database exceeds the size of the variable declared. The error ORA-06502: PL/SQL: numeric or value error: character string buffer too small would be thrown by the oracle. The error occurs because the output value saved in that variable is longer than it was declared.

    The length of the string should not exceed the size of the data type declared in the variable. The string can be stored in the variable in this case. If the length of the character string exceeds the declared variable size, the character string cannot be saved. If the character is attempted to be assigned to the attribute, an exception would be thrown.

    Exception

    The error will be described as follows. The line number identifies the location of the error. The variable data size is larger than the value size. The following error has been thrown.

    Two ORA errors can be seen in the error stack trace. The first error code is shown alongside the error message. The second error code indicates which line the error happened on. The error indicates that the declared string variable’s size is insufficient in comparison to the value assigned to it.

    Problem

    The character string cannot be allocated if the length of the string exceeds the size of the declared data type variable. The error can be repeated in this scenario. The database is attempting to assign the variable a string. The error would be thrown since the string is longer than the variable’s length.

    In the example below, the value has four characters. The variable is declared to be three characters long. The length of the string value exceeds the length of the declared variable. The error ORA-06502:PL/SQL: numeric or value error: character string buffer too small would be thrown if the value is assigned to a variable that is smaller in size.

    Output

    Cause

    An arithmetic, numeric, string, conversion, or constraint error occurred. For example, this error occurs if an attempt is made to assign the value NULL to a variable declared NOT NULL, or if an attempt is made to assign an integer larger than 99 to a variable declared NUMBER(2).

    Action

    Change the data, how it is manipulated, or how it is declared so that values do not violate constraints.

    Solution 1

    The size of the value passed in Oracle PS./SQL exceeds the declared character data type size. To accommodate the value, the variable data type should be modified. The character data type’s size should be increased. If the size of the character data type is reached to maximum size of the data type, the different data type should be used to accommodate the larger value.

    Output

    Solution 2

    It’s essential to double-check the PL/SQL value. It’s possible that the value was passed to the variable inappropriately or that there was an error in the method. The value will be stored in the variable if it is corrected.

    Output

    Solution 3

    In most instances, the value assigned would be within the declared data type’s range. The length of the value sometimes reaches the declared data type size. We can’t adjust the data type size in this situation. The exception should be handled and taken action in the PL/SQL code.

    Источник

    How to solve numeric or value error: character string buffer too small?

    I’m having this really simple PL/SQL anonymous block that returns the current time in seconds. I get an error when I run it.

    So, here’s my (rather short) code: If I remove the «:P24_TIME := x_seconds_systime;» part, then it works like a charm. But I can’t just remove this, because I need to put the resulting value in this item (I use this code on APEX).

    So, if I run it as it is now (and you can test it yourself), then it gives the following error: I assume that the to_char has something to do with this. Probably because the number it has to hold exceeds the limit of the max value a char can have. So, how do I work around this?

    Any help is really appreciated, I’m stuck on this since yesterday morning and I still haven’t found it. Thanks.

    Answers

    Firstly, why are you using a clob? A number or perhaps varchar2 would do.

    Secondly, what’s your definiton of p24_time. I have no problem
    Edited by: Paul Horth on 25-Apr-2012 01:56

    It’s not about the CLOB here, it’s about the to_char that’s failing.
    I need the CLOB because It’ll be a larger number when I start calculating with it. Even a NUMBER won’t do.

    So please, just a fix on how to get the to_char thing working. Just try the code yourself.

    And just how are you going to do calculations on a CLOB which is a string?
    A NUMBER datatype can hold some pretty big numbers. Just what exactly are you trying to do?

    I wasn’t at that stage yet. I just wanted to get rid of the error.
    The item p24_TIME is just a item with a static value in APEX. It’s not defined as anything, nor is it even a varchar2. Just a page item that holds some value, regardless of what data type that value was.

    I used a CLOB because from what I found on the internet, that’s supposed to hold large amounts of data. Since I will be having data that has 34000 as a value or something, I figured that a varchar2 couldn’t hold it because that’s too large. That’s why I tried it with the CLOB.

    Don’t shoot at me, kay? I just learned how to use a cursor last week, before that all I could do was fetch single row data and display that on a page in APEX.

    Thanks for telling. I really thought that the value it should hold shouldn’t exceed the maximum, sorry about that.
    If I replace CLOB with NUMBER and to_clob with to_number, I still get the same error.

    Code is now like this:

    First of all, if you want the number of seconds since midnight, Oracle date arithmetic makes this pretty easy.

    SYSDATE contains the current date and time, including seconds.

    TRUNC(SYSDATE) contains the current date at midnight.

    SYSDATE — TRUNC(SYSDATE) gives a number that is the difference in days between the two dates, including a fraction for the time difference.

    To get the number of seconds since midnight, multiply SYSDATE — TRUNC(SYSDATE) by the number of seconds in a day.

    To assign a number to a VARCHAR2, always prefer an explicit conversion using TO_CHAR. ‘TM’ means «text minimum», which will produce the shortest possible string; otherwise you might get a space in front, which is a placeholder for the minus sign.Now, you are getting your error because :P24_ITEM is defined as a VARCHAR2 that is not long enough to hold the data. You can see the error if you define a PL/SQL variable in place of :P24_ITEMHow you redefine :P24_ITEM to be longer is an APEX problem.

    Edited by: Stew Ashton on Apr 25, 2012 12:22 PM

    Источник

    Smart way of Technology

    Worked in Database technology for fixed the issues faced in daily activities in Oracle, MS SQL Server, MySQL, MariaDB etc.

    ORA-06502: PL/SQL: numeric or value error: character string buffer too small

    ORA-06502: PL/SQL: numeric or value error: character string buffer too small

    This error occurred while varchar character is overflow from its specified length. In this blog, we show you the example by generating error and fixed it by increasing the size of varchar character.

    Error:
    Generate error while fetching data which is concatenating in the VAR variable having 1000 bytes limit defined in DECLARE part.

    set serveroutput on
    DECLARE
    —var varchar2(32767);
    —var varchar2(20000);
    var varchar2(1000); — Size is 1000 bytes
    var1 number;
    CURSOR cn IS SELECT object_name FROM dba_objects where rownum NULL);
    FOR v_objectname IN cn
    LOOP
    var1 := 1+var1;
    var := var || v_objectname.object_name;
    dbms_output.put_line(var1);
    —Dbms_output.put_line(var);
    END LOOP;
    END;
    /

    OUTPUT
    1
    2
    .
    .
    119
    120
    DECLARE
    *
    ERROR at line 1:
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 14
    ORA-06512: at line 14

    Solution
    Increase the limit of VAR variable to 2000, it will fixed the issue.
    Maximum limit of VARCHAR2 is 32767.

    set serveroutput on
    DECLARE
    var varchar2(2000); — Size is 2000 bytes
    var1 number;
    CURSOR cn IS SELECT object_name FROM dba_objects where rownum NULL);
    FOR v_objectname IN cn
    LOOP
    var1 := 1+var1;
    var := var || v_objectname.object_name;
    dbms_output.put_line(var1);
    —Dbms_output.put_line(var);
    END LOOP;
    END;
    /

    PL/SQL procedure successfully completed.

    Like this:

    About SandeepSingh DBA

    Hi, I am working in IT industry with having more than 10 year of experience, worked as an Oracle DBA with a Company and handling different databases like Oracle, SQL Server , DB2 etc Worked as a Development and Database Administrator.

    Leave a Reply Cancel reply

    This site uses Akismet to reduce spam. Learn how your comment data is processed.

    Источник

    ORA-06502: PL/SQL: numeric or value error: character string buffer too smal

    I have a PL/SQL function body returning SQL query. The select statement that I’m trying to return is huge (lots of hidden ID columns etc. ), much larger than the initial variable I had defined, v_query VARCHAR2 (32767). So I defined my variable as a CLOB instead but I still can’t return the value, I get the same error, it’s almost like there’s a limit on the size of the return variable!

    What’s the work around, how can I return this huge select statement from the source region and use it to build my layout.

    Answers

    Probably you can create a view and then select statement will be :
    select * from HUGE_VIEW

    if your function returns a varchar2, there is still the same limit of 32767. So your function should also return a clob. But a SQL with this size is of course possible but is not very handy (also not for the optimizer), I think you also have to look to optimize the SQL code.

    Herald ten Dam
    http://htendam.wordpress.com

    My function DOES I return a clob, but it doesn’t work. I get the same error (ORA-06502: PL/SQL: numeric or value error: character string buffer too small) that I get if I return a varchar2(32767).

    I’m trying to return a large sql statement that displays multiple lines of data with about 20 columns per row. I need to use PL/SQL function body returning query because of the dynamic nature of the data.

    Instead of returning a string representation of the query, why not return a collection and query it via th «TABLE» keyword in your query:

    1. Amend your function to return a collection (I’d also recommend making it pipelined for performance) e.g.

    (You will first need to define a collection type, either by basing it on an existing table ala the %rowtype keyword, or by creating a collection of a custom record type — see documentation for more details)
    2. In the appropriate report region, your query should now be ‘static’ and along the lines of:
    The above assumes a static ‘select’ clause i.e. if your function currently returns a variable number of fields, it will cause you problems.

    p.s. I’m back now, although the OTN forum appear to have ‘lost’ my old account as a result of me attempting to change the email address when the error happened last week, so I’ve lost ALL my helpful points. Thanks OTN! 🙂

    I will look into this, but yes, my function returns a variable number of fields, in other words nothing about the select statement I need to build is static. Think of it this way, the number of columns in the region and the heading for those columns are dependant on the current customer. The customer setups are kept in other tables which I query to build the layout in the region for this particular customer, so I really can’t hard code any type of select statement. I’ve thought of building a view on the fly that always has the same name but returns very different things based on the current customer, but what if two users tried to use the form at the same time? The view would get re-created by the second user and blow up what the first user is working on.

    Edited by: blue4speed on Oct 1, 2010 12:02 PM

    The limitation that you are running into isn’t a limitation of ApEx, it’s a limitation of dynamic SQL (which is what the PL/SQL function returning query is passed to). The ApEx engine behind the scenes is going to try to execute the query you dynamically build either via an EXECUTE IMMEDIATE statement or via the DBMS_SQL package. I don’t know which it uses, but both have a 32K-character limitation on the statement to be executed.

    A 32K-character SQL statement, assuming a conservative 40-characters per line, is a 800+ line query statement. Even if it could be made to work, I’d be amazed if it performed well. Just a suggestion, but I’d look to re-working the approach.

    Hope this helps,
    John

    If you find this information useful, please remember to mark the post «helpful» or «correct».

    Thanks jrager, that’s helpful. I’ve had a lot of people tell me my query is too long, but think about how much has to be in there that’s not data related. I’m trying to show quote lines from the Oracle quote module in a APEX form, some quote have 200-300 lines. Here’s just 2 lines generated by my sql statement, this shows about 20 columns, this is 3503 characters so think what happens when I get a 50 line quote.

    SELECT apex_item.text (22,’1′,5,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Line Number», apex_item.text (22,’X4270-S1-AA’,20,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Item Number», apex_item.text (22,’SUN FIRE X4270 X64 SERVER: 2.5-INCH HDD BASE CHASSIS PACKAGE INCLUDING MOTHERBOARD, NO DVD, 1 X PSU, REDUNDANT FANS AND SERVICE PROCESSOR FOR FACTORY INTEGRATION. ROHS-6.’,50,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Description», apex_item.text (22,’8′,5,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Quantity», apex_item.text (22,’EA’,7,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «UOM», apex_item.hidden(22,3749) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Project Number», apex_item.hidden(22,3750) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Project Name», apex_item.hidden(22,3751) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Data Center», apex_item.hidden(22,3752) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Line of Business», apex_item.hidden(22,3753) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Cost Center», apex_item.hidden(22,3754) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Project Manager», apex_item.hidden(22,3755) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Buyer», apex_item.hidden(22,3756) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Order Classification» FROM aso_quote_lines
    WHERE quote_header_id = 18430 and line_number = 1
    UNION
    SELECT
    apex_item.text (22,’2′,5,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Line Number», apex_item.text (22,’X9238-1-A’,20,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Item Number», apex_item.text (22,’POWER JUMPER CABLE, 2.5 METER (QTY 1), FOR SUN RACK 900/1000. THIS PRODUCT IS HAZARD CLASS Y, ROHS COMPLIANT.’,50,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Description», apex_item.text (22,’16’,5,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Quantity», apex_item.text (22,’EA’,7,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «UOM», apex_item.hidden(22,3757) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Project Number», apex_item.hidden(22,3758) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Project Name», apex_item.hidden(22,3759) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Data Center», apex_item.hidden(22,3760) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Line of Business», apex_item.hidden(22,3761) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Cost Center», apex_item.hidden(22,3762) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Project Manager», apex_item.hidden(22,3763) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Buyer», apex_item.hidden(22,3764) , apex_item.text (22,’test’,12,100,’readonly=»readonly»‘,’f22_’||LPAD (ROWNUM, 4, ‘0’)) «Order Classification» FROM aso_quote_lines
    WHERE quote_header_id = 18430 and line_number = 2

    You may ask why I do it this way, the final 8 columns and the data is determined dymanically by data held in other tables. The data maybe different for each quote line, here’s the code.

    DECLARE
    v_query clob;
    v_counter NUMBER := 22;

    — define the main cursor loop to return the lines for the quote
    FOR quote_lines IN
    (SELECT line_number
    ,mtl.segment1
    ,mtl.description
    ,line.quantity
    ,line.uom_code
    ,line.quote_line_id
    FROM aso_quote_lines_all line
    ,mtl_system_items_b mtl
    WHERE
    mtl.organization_id = line.organization_id
    AND line.inventory_item_id = mtl.inventory_item_id
    AND line.quote_header_id = :P3_QUOTE_HEADER_ID)
    —AND ROWNUM = 1)
    —AND line.quote_header_id = 13643)

    — Get the values for each line returned by the main loop
    FOR c in
    (SELECT »»||quote_lines.line_number||»» line_number
    ,»»||quote_lines.segment1||»» item_number
    ,»»||quote_lines.description||»» item_description
    ,»»||quote_lines.quantity||»» quantity
    ,»»||quote_lines.uom_code||»» uom
    FROM aso_quote_lines line
    WHERE quote_header_id = :P3_QUOTE_HEADER_ID
    AND line_number = quote_lines.line_number
    ORDER BY quote_lines.line_number)

    — Define the items for the read only line values
    v_query :=
    v_query
    || ‘apex_item.text (‘
    || v_counter
    || ‘,’
    || c.line_number
    || ‘,’
    || ‘5,’
    || ‘100,’
    || »’readonly=»readonly»»,’
    || »’f’
    || LPAD (v_counter, 2, 0)
    || ‘_»’
    || ‘||LPAD (ROWNUM, 4, »0»)’
    || ‘) ‘
    || ‘»‘||’Line Number’||’»‘
    || ‘, ‘;

    —v_counter := v_counter + 1;

    v_query :=
    v_query
    || ‘apex_item.text (‘
    || v_counter
    || ‘,’
    || c.item_description
    || ‘,’
    || ’50,’
    || ‘100,’
    || »’readonly=»readonly»»,’
    || »’f’
    || LPAD (v_counter, 2, 0)
    || ‘_»’
    || ‘||LPAD (ROWNUM, 4, »0»)’
    || ‘) ‘
    || ‘»‘||’Description’||’»‘
    || ‘, ‘;

    — Get the column names, values and ids
    FOR d in
    (SELECT
    —»»||replace(label_name,»»)||»» column_name
    label_name column_name
    —,»»||replace(value,»»)||»» value —field values
    — Account for ticks in data i.e. ‘Guns N’ Roses’
    ,(»»||replace(value,»»,»»»)||»») value
    ,value_id
    FROM
    forx_label_transactions trans
    ,forx_hz_cust_level_labels lab
    ,forx_hz_cust_levels cust_lev
    ,forx_levels lev
    ,forx_hz_mvp_customers cust
    WHERE lab.cust_level_id = cust_lev.cust_level_id
    AND cust_lev.level_id = lev.level_id
    AND cust_lev.mvp_id = cust.mvp_id
    AND cust.cust_account_id = :P3_CUST_ACCOUNT_ID
    AND lev.level_name = ‘Quote Line’
    AND trans.source_transaction_id(+) = quote_lines.quote_line_id
    AND trans.label_id(+) = lab.label_id
    and sysdate between lab.start_date_active
    and nvl(lab.end_date_active,sysdate +1)
    ORDER BY lab.position asc)

    — Define the items to hold the custom field values

    —v_counter := v_counter + 1;

    v_query := RTRIM (v_query, ‘, ‘);

    v_query := v_query || ‘ FROM aso_quote_lines ‘ || ‘ WHERE quote_header_id = ‘||:P3_QUOTE_HEADER_ID ||’ and line_number = ‘||quote_lines.line_number
    ||’ UNION SELECT ‘;

    Edited by: blue4speed on Oct 1, 2010 12:52 PM

    Edited by: blue4speed on Oct 1, 2010 12:53 PM

    Edited by: blue4speed on Oct 1, 2010 12:56 PM

    Edited by: blue4speed on Oct 1, 2010 1:05 PM

    Edited by: blue4speed on Oct 1, 2010 1:05 PM

    Edited by: blue4speed on Oct 1, 2010 1:06 PM

    Edited by: blue4speed on Oct 1, 2010 1:09 PM

    Источник

    Are you getting an ORA-06502 error message when working with Oracle SQL? Learn how to resolve it and what causes it in this article.

    ORA-06502 Cause

    The cause of the “ORA-06502 PL/SQL numeric or value error” can be one of many things:

    1. A value is being assigned to a numeric variable, but the value is larger than what the variable can handle.
    2. A non-numeric value is being assigned to a numeric variable.
    3. A value of NULL is being assigned to a variable which has a NOT NULL constraint.

    Let’s take a look at the solutions for each of these causes.

    The solution for this error will depend on the cause.

    Let’s see an example of each of the three causes mentioned above.

    Solution 1: Value Larger than Variable (Number Precision Too Large)

    In this example, we have some code that is setting a numeric variable to a value which is larger than what can be stored.

    Let’s create this procedure which declares and then sets a variable:

    CREATE OR REPLACE PROCEDURE TestLargeNumber
    AS
      testNumber NUMBER(3);
    BEGIN
      testNumber := 4321;
    END;

    If we compile it, it compiles with no errors.

    Procedure TESTLARGENUMBER compiled

    Now, let’s run the procedure.

    EXEC TestLargeNumber;

    We get an error:

    Error starting at line : 8 in command -
    EXEC TestLargeNumber
    Error report -
    ORA-06502: PL/SQL: numeric or value error: number precision too large
    ORA-06512: at "SYSTEM.TESTLARGENUMBER", line 5
    ORA-06512: at line 1
    06502. 00000 -  "PL/SQL: numeric or value error%s"
    *Cause:    An arithmetic, numeric, string, conversion, or constraint error
               occurred. For example, this error occurs if an attempt is made to
               assign the value NULL to a variable declared NOT NULL, or if an
               attempt is made to assign an integer larger than 99 to a variable
               declared NUMBER(2).
    *Action:   Change the data, how it is manipulated, or how it is declared so
               that values do not violate constraints.

    The error we’ve gotten is “ORA-06502: PL/SQL: numeric or value error: number precision too large”. It also includes an ORA-06512, but that error just mentions the next line the code is run from, as explained in this article on ORA-06512.

    This is because our variable testNumber can only hold 3 digits, because it was declared as a NUMBER(3). But, the value we’re setting it to a few lines later is 4 digit long (4321).

    So, the value is too large for the variable.

    To resolve it, increase the size of your variable, or manipulate your value to fit the size of the variable (if possible).

    In our example , we can change the size of the variable.

    CREATE OR REPLACE PROCEDURE TestLargeNumber
    AS
      testNumber NUMBER(4);
    BEGIN
      testNumber := 4321;
    END;
    Procedure TESTLARGENUMBER compiled

    Now, let’s run the procedure.

    EXEC TestLargeNumber;
    PL/SQL procedure successfully completed.

    The procedure runs successfully. We don’t get any output (because we didn’t code any in), but there are no errors.

    Read more on the Oracle data types here.

    Solution 2: Non-Numeric Value

    Another way to find and resolve this error is by ensuring you’re not setting a numeric variable to a non-numeric value.

    For example, take a look at this function.

    CREATE OR REPLACE PROCEDURE TestNonNumeric
    AS
      testNumber NUMBER(4);
    BEGIN
      testNumber := 'Yes';
    END;
    Procedure TESTNONNUMERIC compiled

    The procedure compiles successfully. Now, let’s fun the function.

    EXEC TestNonNumeric;
    Error starting at line : 8 in command -
    EXEC TestNonNumeric
    Error report -
    ORA-06502: PL/SQL: numeric or value error: character to number conversion error
    ORA-06512: at "SYSTEM.TESTNONNUMERIC", line 5
    ORA-06512: at line 1
    06502. 00000 -  "PL/SQL: numeric or value error%s"
    *Cause:    An arithmetic, numeric, string, conversion, or constraint error
               occurred. For example, this error occurs if an attempt is made to
               assign the value NULL to a variable declared NOT NULL, or if an
               attempt is made to assign an integer larger than 99 to a variable
               declared NUMBER(2).
    *Action:   Change the data, how it is manipulated, or how it is declared so
               that values do not violate constraints.

    The error we get is “ORA-06502: PL/SQL: numeric or value error: character to number conversion error”.

    This happens because our variable testNumber is set to a NUMBER, but a few lines later, we’re setting it to a string value which cannot be converted to a number

    To resolve this error:

    1. Ensure the value coming in is a number and not a string.
    2. Convert your string to a number using TO_NUMBER (the conversion might happen implicitly but this may help).
    3. Convert your string to the ASCII code that represents the string using the ASCII function.
    4. Change the data type of your variable (but check that your code is getting the right value first).

    The solution you use will depend on your requirements.

    Solution 3: NOT NULL Variable

    This error can appear if you try to set a NULL value to a NOT NULL variable.

    Let’s take a look at this code here:

    CREATE OR REPLACE PROCEDURE TestNonNull
    AS
      testNumber NUMBER(4) NOT NULL := 10;
      nullValue NUMBER(4) := NULL;
    BEGIN
      testNumber := nullValue;
    END;

    Procedure TESTNONNULL compiled

    Now, the reason we’re using a variable to store NULL and not just setting testNumber to NULL is because we get a different error in that case. Besides, it’s probably more likely that your NULL value will come from another system or a database table, rather than a hard-coded NULL value.

    Let’s run this function now.

    Error starting at line : 9 in command -
    EXEC TestNonNull
    Error report -
    ORA-06502: PL/SQL: numeric or value error
    ORA-06512: at "SYSTEM.TESTNONNULL", line 6
    ORA-06512: at line 1
    06502. 00000 -  "PL/SQL: numeric or value error%s"
    *Cause:    An arithmetic, numeric, string, conversion, or constraint error
               occurred. For example, this error occurs if an attempt is made to
               assign the value NULL to a variable declared NOT NULL, or if an
               attempt is made to assign an integer larger than 99 to a variable
               declared NUMBER(2).
    *Action:   Change the data, how it is manipulated, or how it is declared so
               that values do not violate constraints.

    We get the ORA-06502 error.

    This error message doesn’t give us much more information. But, we can look at the code on line 6, as indicated by the message. We can see we have a variable that has a NOT NULL constraint, and the variable is NULL.

    To be sure, we can output some text in our demo when it is null.

    CREATE OR REPLACE PROCEDURE TestNonNull
    AS
      testNumber NUMBER(4) NOT NULL := 10;
      nullValue NUMBER(4) := NULL;
    BEGIN
      IF (nullValue IS NULL) THEN
        dbms_output.put_line('Value is null!');
      ELSE
        testNumber := nullValue;
      END IF;
    END;

    Now let’s call the procedure.

    EXEC TestNonNull;
    Value is null!

    The output shows the text message, indicating the value is null.

    ORA-06502 character string buffer too small

    This version of the error can occur if you set a character variable to a value larger than what it can hold.

    When you declare character variables (CHAR, VARCHAR2, for example), you need to specify the maximum size of the value. If a value is assigned to this variable which is larger than that size, then this error will occur.

    For example:

    DECLARE
      charValue VARCHAR2(5);
    BEGIN
      charValue := 'ABCDEF';
    END;

    If I compile this code, I get an error:

    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 4

    This happens because the variable is 5 characters long, and I’m setting it to a value which is 6 characters long.

    You could also get this error when using CHAR data types.

    DECLARE
      charValue CHAR(5);
    BEGIN
      charValue := 'A';
      charValue := charValue || 'B';
    END;
    ORA-06502: PL/SQL: numeric or value error: character string buffer too small
    ORA-06512: at line 5

    This error happens because the CHAR data type uses the maximum number of characters. It has stored the value of A and added 4 space characters, up until its maximum value of 5.

    When you try to concatenate a value of B to it, the resulting value is ‘A    B’, which is 6 characters.

    To resolve this, use a VARCHAR2 variable instead of a CHAR, and ensure the maximum size is enough for you.

    ORA-06502: pl/sql: numeric or value error: null index table key value

    Sometimes you might get this error message with the ORA-06502 error:

    ORA-06502: pl/sql: numeric or value error: null index table key value

    This means that either:

    • Your index variable is not getting initialized, or
    • Your index variable is getting set to NULL somewhere in the code.

    Check your code to see that neither of these two situations are happening.

    ORA-06502: pl/sql: numeric or value error: bulk bind: truncated bind

    You might also get this specific error message:

    ORA-06502: pl/sql: numeric or value error: bulk bind: truncated bind

    This is caused by an attempt to SELECT, UPDATE, or INSERT data into a table using a PL/SQL type where a column does not have the same scale as the column in the table.

    For example, you may have declared a variable in PL/SQL to be VARCHAR2(100), but your table is only a VARCHAR2(50) field. You may get this error then.

    You may also get this error because some data types in PL/SQL have different lengths in SQL.

    To resolve this, declare your variables as the same type as the SQL table:

    type t_yourcol is table of yourtable.yourcol%TYPE;

    So, that’s how you resolve the ORA-06502 error.

    Lastly, if you enjoy the information and career advice I’ve been providing, sign up to my newsletter below to stay up-to-date on my articles. You’ll also receive a fantastic bonus. Thanks!

    Понравилась статья? Поделить с друзьями:
  • Pl sql hex to raw conversion error
  • Pl sql format error backtrace
  • Pkt loss pubg как исправить
  • Pkgj ps vita ошибка 0x80436007
  • Pkg static repository freebsd load error meta cannot be loaded no error 0