пытаясь улучшить мой код, он больше не работает - PullRequest
0 голосов
/ 07 ноября 2018

Я делаю код, чтобы получить число из таблицы в другом месте с помощью курсора и других вещей, а затем я изменяю эти числа и помещаю эти числа в новую таблицу.

пример:

я получаю номера: 12.34.56 я добавляю эти цифры между точками: 3.7.11 и эти последние цифры идут в новую таблицу, но когда я пытался сделать это с помощью for, он говорит, что у меня ошибка цикла.

Не могли бы вы помочь мне найти и изменить мою ошибку? спасибо за ваше время.

CREATE OR REPLACE PACKAGE PKG_PREGUNTA3
AS 
FUNCTION FNC_PRAGUNTA3 (PHONE VARCHAR2)RETURN VARCHAR2;
END;

CREATE OR REPLACE PACKAGE BODY PKG_PREGUNTA3
AS 

FUNCTION FNC_PRAGUNTA3 (PHONE VARCHAR2)RETURN VARCHAR2
IS 
CURSOR CUR_PHONE IS
SELECT PHONE_NUMBER
FROM HR.EMPLOYEES  ;
pene NUMBER(30);
pena NUMBER(30);
x NUMBER(3);
y NUMBER(3);
z NUMBER(3);
NEW_PHONE VARCHAR2(45);

BEGIN
x:=1;
y:=1;
z:=0;
OPEN CUR_PHONE;
LOOP
FETCH CUR_PHONE INTO VALOR;
EXIT WHEN CUR_PHONE%NOTFOUND;
    if long(pen)=0 then
    pen:=substr(PHONE,1,(instr(PHONE,'.',y,x)-1));
        for i in 1..LENGTH(pen)LOOP
        pena:=pena+i;
        end loop;
    end if;
NEW_PHONE:=pena;
END LOOP;
CLOSE CUR_PHONE;
RETURN NEW_PHONE;
END;
END;

Ответы [ 2 ]

0 голосов
/ 07 ноября 2018

Вот как вы можете это сделать.

Контрольный пример:

    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>
0 голосов
/ 07 ноября 2018

Попробуйте цикл for, это намного проще:

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

Доступ к элементам курсора, например, VALOR.element, например. VALOR.pene

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...