內建 REVERSE 僅能整串反轉,無法按分隔符分組反轉(如 a,b,c → c,b,a)。本文提供可直接部署的 REVERSE_F 函數,支援自定義分隔符與分組反轉邏輯。
CREATE OR REPLACE FUNCTION REVERSE_F(
p_str VARCHAR2,
p_delimiter VARCHAR2 := ''
) RETURN VARCHAR2 IS
v_return VARCHAR2(4000);
vp_str VARCHAR2(4000) := p_str;
v_idx NUMBER;
vp_len NUMBER := LENGTH(p_delimiter);
BEGIN
IF p_delimiter IS NULL THEN
SELECT REVERSE(p_str) INTO v_return FROM dual;
ELSE
LOOP
v_idx := INSTR(vp_str, p_delimiter);
IF v_idx = 0 THEN
v_return := vp_str || v_return;
EXIT;
ELSIF v_idx = 1 THEN
v_return := SUBSTR(vp_str, 1, vp_len) || v_return;
vp_str := SUBSTR(vp_str, vp_len + 1);
ELSE
v_return := SUBSTR(vp_str, 1, v_idx - 1) || v_return;
vp_str := SUBSTR(vp_str, v_idx);
END IF;
END LOOP;
END IF;
RETURN v_return;
END REVERSE_F;
SELECT REVERSE_F('a,b,c', ',') FROM dual; -- 返回 'c,b,a'
SELECT REVERSE_F('2023-01-15', '-') FROM dual; -- 返回 '15-01-2023'
SELECT REVERSE_F('hello') FROM dual; -- 返回 'olleh' (無分隔符走內建 REVERSE)
p_delimiter 為空時退化為內建 REVERSE;