Вам не нужна функция (PL / SQL), SQL может сделать это:
SQL> with
2 -- input string
3 test (col) as
4 (select 'test|1$test2|4$test4|5$test9|3' from dual),
5 -- intermediate CTE which creates rows
6 inter as
7 (select regexp_substr(col, '[^$]+', 1, level) val
8 from test
9 connect by level <= regexp_count(col, '\$') + 1
10 )
11 -- create two columns out of each substring
12 select substr(val, 1, instr(val, '|') - 1) key,
13 substr(val, instr(val, '|') + 1) value
14 from inter;
KEY VALUE
---------- ----------
test 1
test2 4
test4 5
test9 3
SQL>
Но, если должна быть функцией, она не должнаСлишком сложно преобразовать приведенный выше код в один.