PLSQL новая зарплата не отображается или отображается неправильно - PullRequest
0 голосов
/ 15 декабря 2011

Спасибо, за идею

Я должен написать процедуру, которая вычисляет номер проекта, и средние часы работы сотрудников, где идентификатор сотрудника передается как параметр к процедуре. Если среднее рабочее время меньше 10 тогда зарплата сотрудника остается прежней, в противном случае проверьте, если число проекта составляет менее 4, то 5% от заработной платы, в противном случае 10% от заработной платы добавили к зарплате.

что-то не так с моим выводом в заявлении plsql, которое не отображается новая зарплата

вот моя процедура plsql:

create or replace procedure view_data(p_id number) is
cursor c1 
is
  select count(distinct a.projectid) as PRJ_COUNT, e.empid, e.empname, e.salary as old_sal, round(avg(a.hours),0)as AVG_HOURS
  from assignment a join employee e
  on a.empid=e.empid
  where e.empid=p_id
  group by e.empid,e.empname, e.salary;
creader c1%rowtype;  
cursor c2
is
  select empid, salary as new_sal
  from employee 
  where empid=p_id for update of salary;
rate_rec c2%rowtype;

v_new_salary number;
begin
  --open c1;
  --fetch c1 into creader;
  for creader in c1 loop

  for rate_rec in c2 loop
    if creader.avg_hours < 10 then
      update employee set salary=rate_rec.new_sal
      where empid=rate_rec.empid;

    elsif creader.prj_count<4 then
      update employee set salary=rate_rec.new_sal+rate_rec.new_sal*0.05
      where empid=rate_rec.empid;

    else
      update employee set salary=rate_rec.new_sal+rate_rec.new_sal*0.1
      where empid=rate_rec.empid;

    end if;
   select salary into v_new_salary from employee
   where empid=creader.empid;

  dbms_output.put_line('Employee ID: '||creader.empid);
  dbms_output.put_line('Employee Name: '||creader.empname);
  dbms_output.put_line('Number of projects: '||creader.prj_count);
  dbms_output.put_line('Average Working Hours: '||creader.avg_hours);
  dbms_output.put_line('Old Salary: '||rate_rec.new_sal);
  dbms_output.put_line('New Salary: '||v_new_salary);

  end loop;
 end loop;



  end view_data;
  /

вот вывод:

Employee ID: 101
Employee Name: Marlen
Number of projects: 3
Average Working Hours: 87
Old Salary: 39206
New Salary: 41166

решение с использованием курсоров:

create or replace procedure view_data(p_id number) is
cursor c1 
is
  select count(distinct a.projectid) as PRJ_COUNT, e.empid, e.empname, e.salary as old_sal, round(avg(a.hours),0)as AVG_HOURS
  from assignment a join employee e
  on a.empid=e.empid
  where e.empid=p_id
  group by e.empid,e.empname, e.salary;
creader c1%rowtype;  
cursor c2
is
  select empid, salary as new_sal
  from employee 
  where empid=p_id for update of salary;
rate_rec c2%rowtype;

v_new_salary number;
v_bonus number;
begin
  for creader in c1 loop
  for rate_rec in c2 loop
    if creader.avg_hours >= 10 then
        if creader.prj_count<4 then
           update employee set salary=salary*1.05
           where empid=rate_rec.empid
           return salary into v_new_salary;

    else
           update employee set salary=salary*1.1
           where empid=rate_rec.empid
          returning salary into v_new_salary;

       end if;
    end if;
  v_bonus:=v_new_salary-rate_rec.new_sal;

  dbms_output.put_line('Employee ID: '||creader.empid);
  dbms_output.put_line('Employee Name: '||creader.empname);
  dbms_output.put_line('Number of projects: '||creader.prj_count);
  dbms_output.put_line('Average Working Hours: '||creader.avg_hours);
  dbms_output.put_line('Old Salary: '||creader.old_sal);
  dbms_output.put_line('Bonus: '||v_bonus);
  dbms_output.put_line('New Salary: '||v_new_salary);

  end loop;
 end loop;



  end view_data;
  /

1 Ответ

1 голос
/ 15 декабря 2011

Переменная rate_rec находится в области видимости в цикле, а не снаружи.Вы должны поместить все свои put_line в цикл.

rate_rec.new_sal - старая зарплата.Новый будет обновлен в таблице, а не в записи с предыдущим окладом.

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

Вот возможное решение.Я не проверил тщательно запрос.Вероятно, в конце процедуры должен быть commit.

set serveroutput on

create or replace procedure update_data(p_id number) is
prj_count integer;
avg_hours integer;
old_salary number;
new_salary number;
begin
    select count(a.projectid), round(avg(a.hours),0), e.salary
    into prj_count, avg_hours, old_salary
    from assignment a join employee e on a.empid=e.empid
    where e.empid=p_id
    group by e.salary;

    new_salary := old_salary;

    if avg_hours >= 10 then
        if prj_count<4 then
            update employee set salary=salary+salary*0.05
            where empid=p_id
            returning salary into new_salary;
        else
            update employee set salary=salary+salary*0.1
            where empid=p_id
            returning salary into new_salary;
        end if;
    end if;
    dbms_output.put_line('Old salary: ' || old_salary);
    dbms_output.put_line('New salary: ' || new_salary);
end update_data;
/
...