Algo que no sabía: La Función REVERSE

Hace unos días estaba participando en el  pl/sql challenge y la pregunta consistía en identificar implementaciones que se ejecutaran correctamente para una función llamada “reverse_string” que recibía como parámetro una cadena de caracteres tipo varchar2 y retornaba como resultado otra cadena tipo varchar2 con los caracteres en orden inverso.

Una de las posibles respuestas era la siguiente función:

FUNCTION reverse_string (in_string VARCHAR2)
RETURN VARCHAR2
AS
  l_return   VARCHAR2 (100);
BEGIN
  SELECT REVERSE (in_string) INTO l_return FROM DUAL;

  RETURN l_return;
END reverse_string;

Al ver ese bloque de código, estaba muy seguro de que esa no podía ser una de las respuestas porque nunca había visto ninguna referencia sobre REVERSE en libros, manuales o documentación; pero por algún motivo me entró la desconfianza de que algo no estaba bien, así que me decidí a probar el código.

Abrí un sesión en SQL*PLUS y ejecuté el siguiente query:

SELECT reverse('hello world')
FROM dual;

Para mi sorpresa el query funcionó y mostró la cadena de caracteres en orden inverso: dlrow olleh.

Buscando en Internet encontré que REVERSE es una función que no está documentada y por lo tanto no tiene soporte oficial por parte de Oracle y que ha estado ahí por algún tiempo. Encontré referencias en blogs posts de hace más de siete años atrás, así que parece que he estado viviendo bajo una piedra durante todo este tiempo o a lo mejor nunca tuve un requerimiento para implementar este tipo de funcionalidad que me hubiera hecho encontrarla antes.

Para finalizar, no estoy sugiriendo que usen REVERSE en el código de sus aplicaciones, ya que como mencioné antes es una función que no tiene soporte oficial de Oracle y podría desaparecer en cualquier momento o su comportamiento podría ser modificado sin previo aviso. Otro inconveniente es que la función retorna resultados erróneos cuando se usa con caracteres que necesitan ser representados con múltiples bytes.