Using UTL_RAW.REVERSE
DECLARE
l_string VARCHAR2 (100) := '?taerg LQS/LP t''nsI';
BEGIN
DBMS_OUTPUT.put_line (
UTL_RAW.cast_to_varchar2 (
UTL_RAW.reverse (UTL_RAW.cast_to_raw (l_string))));
END;
Isn't PL/SQL great?
Using Home-Grown PL/SQL
DECLARE
l_string VARCHAR2 (100) := '?taerg LQS/LP t''nsI';
FUNCTION reverse_string (in_string VARCHAR2)
RETURN VARCHAR2
AS
lv_out_string VARCHAR2 (32767);
BEGIN
FOR i IN 1 .. LENGTH (in_string)
LOOP
lv_out_string := SUBSTR (in_string, i, 1) || lv_out_string;
END LOOP;
RETURN lv_out_string;
END reverse_string;
BEGIN
DBMS_OUTPUT.put_line (reverse_string (l_string));
END;
Isn't PL/SQL great?
Compare Performance of Different Approaches
DECLARE
l_string VARCHAR2 (100) := '?taerg LQS/LP t''nsI';
l_string2 VARCHAR2 (100);
last_timing TIMESTAMP;
FUNCTION reverse_string (in_string VARCHAR2)
RETURN VARCHAR2
AS
lv_out_string VARCHAR2 (32767);
BEGIN
FOR i IN 1 .. LENGTH (in_string)
LOOP
lv_out_string := SUBSTR (in_string, i, 1) || lv_out_string;
END LOOP;
RETURN lv_out_string;
END reverse_string;
PROCEDURE start_timer
IS
BEGIN
last_timing := SYSTIMESTAMP;
END;
PROCEDURE show_elapsed_time (message_in IN VARCHAR2 := NULL)
IS
BEGIN
DBMS_OUTPUT.put_line (
CASE
WHEN message_in IS NULL THEN 'Completed in:'
ELSE '"' || message_in || '" completed in: '
END
|| REGEXP_SUBSTR (SYSTIMESTAMP - last_timing,
'([1-9][0-9:]*|0)\.\d{3}')
|| ' seconds');
/* Reset timer */
start_timer;
END;
BEGIN
start_timer;
FOR indx IN 1 .. 100000
LOOP
l_string2 := reverse_string (l_string);
END LOOP;
show_elapsed_time ('Home Grown');
FOR indx IN 1 .. 100000
LOOP
l_string2 :=
UTL_RAW.cast_to_varchar2 (
UTL_RAW.reverse (UTL_RAW.cast_to_raw (l_string)));
END LOOP;
show_elapsed_time ('UTL_RAW');
END;
"Home Grown" completed in: 0.004 seconds
"UTL_RAW" completed in: 0.337 seconds