Собственно, задача уже решена — просто хочу поделиться материалом, т.к. в русскоязычном инете нихрена нет.
И так, задача отсортировать символы внутри строки.
-- Глобальный тип.
CREATE TYPE char_table_t IS TABLE OF CHAR(1);
CREATE OR REPLACE FUNCTION SORT_STRING_INSIDE(p_str VARCHAR2) RETURN VARCHAR2 DETERMINISTIC AS
n NUMBER;
s VARCHAR2(256);
st char_table_t := char_table_t();
BEGIN
FOR n IN 1..LENGTH(p_str)
LOOP
st.EXTEND;
st(n) := SUBSTR(p_str, n, 1);
END LOOP;
SELECT CAST(MULTISET(SELECT * FROM TABLE(st) ORDER BY 1) AS char_table_t)
INTO st
FROM DUAL;
FOR n IN st.FIRST..st.LAST
LOOP
s := s || st(n);
END LOOP;
RETURN s;
END;
Тестим:
SELECT SORT_STRING_INSIDE('6CD25A3478') str FROM DUAL;
str
----------
2345678ACD
Метод "SELECT CAST(MULTISET(..." также можно использовать для сортировки других типов, но тип коллекции должен быть объявлен глобально — с локальными типами Oracle работать не желает (и прямо об этом говорит).
Об этом тут:
http://technology.amis.nl/blog/1217/sorting-plsql-collections-the-quite-simple-way-part-two-have-the-sql-engine-do-the-heavy-lifting