18 июня 2021

Oracle. Строковая функция REVERSE

    Недавно я перевел запрос с MS SQLServer на Oracle. Мне говорят: "не работает". Начал проверять. Оказалось, что если запрос по частям добавить в скрипт, то при его запуске получим ошибку "идентификатор 'REVERSE' должен быть объявлен".
идентификатор 'REVERSE' должен быть объявлен
Проблема в том, что у MS SQLServer есть стандартная строковая функция REVERSE, которая возвращает строковое значение, где символы переставлены в обратном порядке справа налево, а у Oracle ее нет. Но SQL-запрос с вызовом функции REVERSE в Oracle работает... и работает корректно!
    Сначала вопрос с ошибкой я закрыл использованием в скрипте запроса.
select reverse
А потом стал разбираться, что за такая функция REVERSE, которая вроде бы у Oracle есть, а вроде ее и нет.
    В документации по Oracle вы не найдете строковую функцию REVERSE. Это его недокументированная функция. Возможно, она как-то связана с индексами с реверсированным ключом (reverse index). Это подтверждается тем, что функция REVERSE переставляет в обратном порядке, не символы, а байты. Таким образом, при использовании много-байтовых строк, мы получим мусор.
nvarchar2 - select reverse
    Я уже писал о типе данных RAW и о модуле UTL_RAW с функциями для работы с ним. В этом модуле тоже есть функция REVERSE, которая переставляет байты в обратном порядке. То есть при ее использовании "XYZ" из "58595A" превратится в "5A5958".
UTL_RAW.CAST_TO_RAW + UTL_RAW.REVERSE
Значит, если вам нужно вызвать функцию REVERSE в скрипте, то вы можете воспользоваться функциями CAST_TO_RAW, REVERSE и CAST_TO_VARCHAR2 из модуля UTL_RAW:
UTL_RAW: CAST_TO_RAW - REVERSE - CAST_TO_VARCHAR2

Комментариев нет:

Отправить комментарий