试图改善我的代码,它不再起作用

时间:2018-11-07 17:11:59

标签: sql oracle loops

我正在编写代码以使用光标和其他东西从其他地方的表中获取数字,然后我修改这些数字并将这些数字放入新表中。

示例:

我得到的数字:12.34.56 我将这些数字加在点之间:3.7.11 这些最后的数字进入新表,但是当我尝试使用for表示它时,它说我有循环错误。

您能帮助我查找和修改我的错误吗?谢谢您的时间。

sp.diff(f, x).subs(x,0)
0

2 个答案:

答案 0 :(得分:1)

尝试for循环,它要简单得多:

FOR VALOR in CURR_PHONE
LOOP
     {...statements...}
END LOOP;

访问光标元素,例如VALOR。 VALOR.pene

答案 1 :(得分:0)

这是您可能的方法。

测试用例:

    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>