При объединении строк в 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), так как существует ограничение на количество открытых объектов за сеанс.
Ура! все готово к работе 🙌