DBMS_LOB.substr возвращает ноль
v_tmp_clob := DBMS_LOB.substr(v_qry_strng, dbms_lob.getlength(v_qry_strng)-10,1);
предыдущая строка возвращает ноль, хотя v_qry_strng
такое CLOB длиной 32897 символов... кто-нибудь может объяснить?
1 ответ
Решение
Вы не указали версию Oracle.
DBMS_LOB.SUBSTR
возвращает VARCHAR2
(среди прочего, но не CLOB
), который может содержать не более 32767 байтов символов.
Также, DBMS_LOB.SUBSTR
возвращается NULL
на следующих условиях:
- Любой параметр явно NULL
- Парам 2 (сумма) < 1
- Парам 2 (сумма) > 32767
- Параметр 3 (смещение) < 1
- Параметр 3 (смещение)>
LOBMAXSIZE
В вашем выражении у вас есть: dbms_lob.getlength(v_qry_strng)-10
-> 32897-10
-> 32887
как параграф 2.
32887 > 32767
<- Вот почему.
Обновить:
Для копирования из LOB в LOB напрямую используйте DBMS_LOB.COPY
,
В вашем примере это может выглядеть так:
DBMS_LOB.COPY(v_tmp_clob, v_qry_strng, DBMS_LOB.GETLENGTH(v_qry_strng) - 10, 1, 1);