Ошибка хранимой процедуры Oracle при возврате большого значения nvarchar2

Мы написали функцию оракула, которая возвращает nvarchar2. он отлично работает, когда возвращает небольшое значение, например «привет». Однако он возвращает ошибку «ORA-06502: буфер строки символов слишком мал», когда nvarchar2 идет долго (около 3000 символов). есть ли ограничение на размер возвращаемого значения функции?

мы используем такую ​​функцию:

SELECT sampleFunction('sampleArg') FROM DUAL;

person siavash    schedule 26.02.2018    source источник
comment
Существует ограничение на размер переменной, в которой будет храниться результат функции.   -  person vc 74    schedule 26.02.2018
comment
Рассматривали ли вы возможность изменить функцию, чтобы она возвращала NCLOB? Это может соответствовать или не соответствовать вашим потребностям - это зависит от того, как вы используете значения функции, например, вы не сможете группировать или упорядочивать по NCLOB, но это позволит вам практически неограниченную длину.   -  person mathguy    schedule 26.02.2018


Ответы (2)


Типы данных: в документации. Для NVARCHAR2 написано:

Строка символов Unicode переменной длины с максимальной длиной символов size. Вы должны указать размер для NVARCHAR2. Количество байтов может быть в два раза больше size для кодировки AL16UTF16 и в три раза больше size для кодировки UTF8. Максимальный размер определяется определением национального набора символов с верхним пределом:

  • 32767 байт, если MAX_STRING_SIZE = EXTENDED

  • 4000 байт, если MAX_STRING_SIZE = STANDARD

Обратитесь к расширенным типам данных для получения дополнительной информации о параметре инициализации MAX_STRING_SIZE.

Так что 3000 символов — это не предел; но с многобайтовыми символами вы достигаете 4000 байтов. (Предполагая, что вы используете 12cR2 со стандартной длиной строки или любую предыдущую версию).

Это предел в контексте SQL, который у вас есть с показанным вами запросом.

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

declare
  variable1 nvarchar2(4000 char);
  variable2 nvarchar2(4000 byte);
...

Разница между ними на самом деле заключается в том, что любая из этих переменных может принимать 4000 однобайтовых символов, но первая также может принимать до 4000 многобайтовых символов (вплоть до общего жесткого ограничения в 32767 байт), тогда как вторая по-прежнему будет ошибаться с менее чем 4000 многобайтовых символов, если общее количество байтов превышает 4000.

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

person Alex Poole    schedule 26.02.2018

Я решил проблему, изменив тип возвращаемого значения функции с NVARCHAR2 на CLOB.

person siavash    schedule 28.02.2018