PL SQL неверный номер

Не получается поменять запись таблицы

Числовые данные сформировать из двух последних цифр, добавив к ним слева десятичную точку. Указания:

использовать функцию length(строка_символов) для получения количества символов в переменной строка_символов; использовать функцию substr(строка_символов, начальная_позиция, длина_подстроки) для получения подстроки, содержащейся в переменной строка_символов; использовать конкатенацию строк вида ‘.’||строка_символов для добавления символа десятичного разделителя к переменной строка_символов слева; использовать функцию to_number(строка_символов, ‘.99’) для преобразования строковой переменной строка_символов к числовому типу данных; использовать курсорный цикл for.

DECLARE
CURSOR occupancy_cur IS
SELECT EMPLOYEE_ID, COMMISSION_PCT, PHONE_NUMBER FROM EMPLOYEES WHERE COMMISSION_PCT IS NULL;
BEGIN
FOR occupancy_rec IN occupancy_cur
LOOP
update EMPLOYEES set COMMISSION_PCT = SUBSTR(occupancy_rec.PHONE_NUMBER, 1, LENGTH(occupancy_rec.PHONE_NUMBER)) WHERE EMPLOYEE_ID = occupancy_rec.EMPLOYEE_ID;
END LOOP;
commit;
END;

Ответы (1 шт):

Автор решения: 0xdb

Убедитесь, что преобразование работает, как описано в задании:

select employee_id, phone_number, 
    to_number ('.'||substr (phone_number, -2), 
               'FMD99', 'nls_numeric_characters=''.,''') pct
from hr.employees e
where commission_pct is null
/

EMPLOYEE_ID PHONE_NUMBER                PCT
----------- -------------------- ----------
        100 515.123.4567         ,67       
        101 515.123.4568         ,68       
[...]
        206 515.123.8181         ,81       

72 rows selected. 

Потом написать анонимный блок PL/SQL не составит труда:

declare
    cursor cur is 
        select rowid, phone_number, 
            to_number ('.'||substr (phone_number, -2), 
                       'FMD99', 'nls_numeric_characters=''.,''') pct
        from hr.employees
        where commission_pct is null;
    type currows is table of cur%rowtype;
    cr currows;
begin 
    open cur;
    fetch cur bulk collect into cr;
    close cur;
    forall i in indices of cr 
        update hr.employees set commission_pct = cr(i).pct
        where rowid = cr(i).rowid;
    dbms_output.put_line ('Updated '||sql%rowcount||' rows.');    
end;
/

Updated 72 rows.

→ Ссылка