Вот как вы можете это сделать.
Контрольный пример:
SQL> create table employees (phone_number varchar2(20));
Table created.
SQL> insert into employees values ('12.34.56');
1 row created.
SQL> insert into employees values ('22.55.88');
1 row created.
SQL> insert into employees values ('1.44.123');
1 row created.
Функция: разбивает входной параметр (par_phone_number) на 3 части, используя регулярные выражения. Затем он суммирует цифры каждого числа, используя иерархический запрос (вместо используемого цикла FOR).
SQL> create or replace function fnc_pragunta3
2 (par_phone_number in varchar2)
3 return varchar2
4 is
5 retval varchar2(20);
6 begin
7 for cur_r in (select
8 regexp_substr(par_phone_number, '\d+', 1, 1) x,
9 regexp_substr(par_phone_number, '\d+', 1, 2) y,
10 regexp_substr(par_phone_number, '\d+', 1, 3) z
11 from dual
12 )
13 loop
14 select
15 (
16 (select to_char(sum(digit))
17 from (select substr(cur_r.x, level, 1) digit
18 from dual
19 connect by level <= length(cur_r.x))
20 ) ||'.'||
21 (select to_char(sum(digit))
22 from (select substr(cur_r.y, level, 1) digit
23 from dual
24 connect by level <= length(cur_r.y))
25 ) ||'.'||
26 (select to_char(sum(digit))
27 from (select substr(cur_r.z, level, 1) digit
28 from dual
29 connect by level <= length(cur_r.z))
30 )
31 ) into retval
32 from dual;
33 end loop;
34 return retval;
35 end;
36 /
Function created.
Тестирование:
SQL> select
2 phone_number,
3 fnc_pragunta3(phone_number) res
4 from employees;
PHONE_NUMBER RES
-------------------- --------------------
12.34.56 3.7.11
22.55.88 4.10.16
1.44.123 1.8.6
SQL>