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 на следующих условиях:

  1. Любой параметр явно NULL
  2. Парам 2 (сумма) < 1
  3. Парам 2 (сумма) > 32767
  4. Параметр 3 (смещение) < 1
  5. Параметр 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);
Другие вопросы по тегам