У меня есть следующая функция:
CREATE OR REPLACE FUNCTION GetVarchar2 (iclCLOB IN Nvarchar2)
return NVARCHAR2
IS
cnuMAX_LENGTH Constant number := 32767 ;
nuLength Number := DBMS_LOB.getlength(iclCLOB);
sbBuffer Nvarchar2(32767);
begin
dbms_lob.read(iclCLOB,nuLength,1,sbBuffer);
return sbBuffer;
END;
, когда я вызываю это так:
select GetVarChar2(text) from posts where postid = 'anId';
Я получаю эту ошибку:
ORA-22835: буфер слишком мал для преобразования CLOB в CHAR или BLOB в RAW (фактическое значение: 6058, максимум: 2000)
22835. 00000 - "буфер слишком мал для преобразования CLOB в CHAR или BLOB в RAW (фактическое значение:% s, максимум:% s) "* 1011 * * Причина: была предпринята попытка преобразовать CLOB в CHAR или BLOB в RAW, где
размер LOB был больше, чем ограничение буфера для типов CHAR и RAW
.
Обратите внимание, что значения ширины указываются в символах, если для столбца действует семантика длины символа, в противном случае значения ширины указываются в байтах.
* Действие: Выполните одно из следующих действий
1. Уменьшите LOB перед выполнением преобразования,
например, используя SUBSTR для CLOB
2. Используйте DBMS_LOB.SUBSTR для преобразования CLOB в CHAR или BLOB в RAW.
Проблема в том, что размер текста в таблице сообщений типа NCLOB составляет 6059 байт.Это странно, потому что, когда я делаю это без вызова функции, она работает хорошо.т.е. когда я запускаю следующий скрипт:
declare
iclCLOB nvarchar2(6100) := 'Here is the same 6059 bytes string';
cnuMAX_LENGTH number := 32767 ;
nuLength Number := DBMS_LOB.getlength(iclCLOB);
sbBuffer Nvarchar2(32767);
sbBuffer1 Nvarchar2(32767);
begin
dbms_lob.read(iclCLOB,nuLength,1,sbBuffer);
select GetVarChar2(text) into sbBuffer1 from posts where postid = 'anId';
end;
Он запускается без проблем.
Спасибо.