Являются ли переменные типа 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, а также строки. Это правда? Было бы лучше иметь больше объяснений и историю этого вопроса.
Литература:
Ответы
Ответ 1
В PL/SQL нет такой вещи, как изменение определенной части памяти, выделенной для переменной. Если это функция (как в случае с указанными подпрограммами utl_raw
), она всегда возвращает новый экземпляр значения. Если это процедура с параметром in out nocopy
, она может работать с ссылкой на аргумент, а не на его копия, но тем не менее, фактическая работа внутри процедуры включает в себя копирование значений, не работающих в одной и той же памяти. (Хорошо, хорошо, это не относится к LOB, но это не то, о чем вы просили.)
PL/SQL - это процедурный язык поверх SQL. Он разработан, чтобы позволить SQL использовать процедурно, он не предназначен для сверхбыстрой, суперэффективной. Если вам нужно изменить размер байт непосредственно в памяти, вы можете использовать C или ассемблер.