Выбор из сгустков - PullRequest
       1

Выбор из сгустков

0 голосов
/ 27 февраля 2019

Я пытаюсь выбрать данные из буфера, используя DBMS_LOB.SUBSTR (), но получаю ошибку

ORA-06502: PL / SQL: ошибка числа или значения: строка символовслишком маленький буфер

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

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

DBMS_LOB.SUBSTR(RAW_CLOB,INSTR(RAW_CLOB,'ZPT|',INSTR(RAW_CLOB,(dbms_lob.substr(raw_clob, 4,instr(raw_clob,CHR(10))+1))||'1591018726313')+1)-INSTR(RAW_CLOB,(dbms_lob.substr(raw_clob, 4,instr(raw_clob,CHR(10))+1))||'1591018726313')-1,INSTR(RAW_CLOB,(dbms_lob.substr(raw_clob, 4,instr(raw_clob,CHR(10))+1))||'1591018726313')) file_body

, что означает следующее, когда я получаю значения из INSTR

SELECT DBMS_LOB.SUBSTR(RAW_CLOB,1000,63) file_body

Просто запуск в одиночку, вне какой-либо процедуры PLSQL, все равно вызывает ошибку.Когда я сокращаю экстент до приведенного ниже, мне удается получить некоторые результаты, но это только для того, чтобы привести пример:

SELECT DBMS_LOB.SUBSTR(RAW_CLOB,4052,63) file_body

1 Ответ

0 голосов
/ 28 февраля 2019

Вы сказали, что делаете это в PL / SQL, но не показывали PL / SQL, поэтому некоторые из них являются догадками.

Эта ошибка возникает, когда вы выбираете слишком переменнуюмаленький для вашего выбора.DBMS_LOB.SUBSTR возвращает VARCHAR2, максимальная длина которого составляет 4000 байт в SQL (по умолчанию, расширяемая до 32767) и 32767 байт в PL / SQL.Я подчеркиваю количество байтов, потому что это может иметь значение, если вы работаете в базе данных с многобайтовым набором символов, например AL32UTF8.

Даже если вы не достигли абсолютного максимального предела, вы все равно можете получить эту ошибку, еслипеременная, которую вы выбираете INTO слишком мала:

declare
    v    varchar2(10 char);
begin
    select dbms_lob.substr( '12345678901', 11, 1 ) into v from dual;
end;

Если вы собираетесь манипулировать большими CLOBs и разбивать их на части, что означает, что вы всегда проходите промежуточный VARCHAR2, вы должныучитывать это.Обычно это означает разбиение CLOB на куски приемлемого размера.

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