При объединении строк в Oracle PLSQL необходимо помнить следующее:

  • «Если какая-либо строка имеет тип данных VARCHAR2, результат имеет тип данных VARCHAR2 и ограничен 4000 символами»
  • «Если любой из аргументов является CLOB, результатом является временное CLOB».
  • При объединении CLOB с VARCHAR2 результатом будет VARCHAR2, и вы достигнете лимита в 4000!

Таким образом, следующий код вызовет исключение:

DECLARE
    my_v VARCHAR2(30000);
BEGIN 
    my_v := my_v 
           || 'a very large text...'
           || 'b very large text...'
           || 'c very large text...';
    
    ...
    
    UPDATE tbl_x
    SET
        text = myclob;
COMMIT;
END;

облом. 😕

Как я могу объединить большие тексты?

На мой взгляд, самый элегантный способ — использовать dbms_lob вот так:

DECLARE
    my_clob CLOB;
BEGIN
    dbms_lob.createtemporary(my_clob, true);
    dbms_lob.append(my_clob, 'a very large text...');
    dbms_lob.append(my_clob, 'b very large text...');
    dbms_lob.append(my_clob, 'c very large text...');
    
    ...
    
    UPDATE tbl_x
    SET
        text = my_clob;
COMMIT;
    dbms_lob.freetemporary(c);
END;

Обратите внимание: рекомендуется не пропускать dbms_lob.freetemporary(c), так как существует ограничение на количество открытых объектов за сеанс.

Ура! все готово к работе 🙌