Подтвердить что ты не робот

Являются ли переменные типа RAW неизменяемыми в PL/SQL-коде?

Являются ли переменными типа RAW неизменяемыми в PL/SQL-коде? Я имею в виду, могу ли я изменить конкретный байт переменной типа RAW как раз на месте без копирования памяти?

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

UTL_RAW.BIT_AND UTL_RAW.BIT_OR UTL_RAW.OVERLAY

Также этот вопрос тесно связан с эффективной проблемой конкатенации строк. Например, в Java строки тоже неизменяемы, и для этой задачи у нас есть StringBuilder. Я не нашел четкой информации в документах Oracle по этому вопросу. После некоторого googling [1] ответ выглядит как: Да. Переменные типа RAW неизменяемы в коде PL/SQL, а также строки. Это правда? Было бы лучше иметь больше объяснений и историю этого вопроса.

Литература:

4b9b3361

Ответ 1

В PL/SQL нет такой вещи, как изменение определенной части памяти, выделенной для переменной. Если это функция (как в случае с указанными подпрограммами utl_raw), она всегда возвращает новый экземпляр значения. Если это процедура с параметром in out nocopy, она может работать с ссылкой на аргумент, а не на его копия, но тем не менее, фактическая работа внутри процедуры включает в себя копирование значений, не работающих в одной и той же памяти. (Хорошо, хорошо, это не относится к LOB, но это не то, о чем вы просили.)

PL/SQL - это процедурный язык поверх SQL. Он разработан, чтобы позволить SQL использовать процедурно, он не предназначен для сверхбыстрой, суперэффективной. Если вам нужно изменить размер байт непосредственно в памяти, вы можете использовать C или ассемблер.