使用游标查找需要更新薪水的所有员工

时间:2016-07-16 09:36:56

标签: sql plsql

我有一张叫员工的桌子。我正在尝试创建一个匿名的PLSQL块,它输出employees表中员工的姓氏,薪水和雇用。如果雇员雇用的时间超过5年,那么在员工记录旁边,我应该显示字符串:'由于加薪10%'并计算该加薪并将其显示在记录旁边。
我需要使用当前年份(2016年)进行计算,以确定每个员工是否需要加薪。

set serveroutput on
DECLARE 
  v_empno employees.employee_id%TYPE;
  v_lname employees.last_name%TYPE;
  v_salary employees.salary%TYPE;
  v_hiredate employees.hiredate%TYPE;
  v_newsalary number(8,2); 
  CURSOR c_emp IS 
    SELECT e1.employee_id, e1.last_name, e1.salary, e1.hiredate  
    FROM employees e1, 
        (SELECT employee_id, TRUNC(MONTHS_BETWEEN(sysdate, hiredate)/12) years_of_service 
          FROM employees
        ) e2 
    WHERE e1.employee_id =e2.employee_id and years_of_service >5; 
  BEGIN

    OPEN c_emp; 
    LOOP
      FETCH c_emp  into v_empo, v_lname, v_salary, v_hiredate
      DBMS_OUTPUT.PUT_LINE( v_empno ||'  '||v_lname || ' ' || v_salary ||'  '||v_hiredate );  
    END LOOP; 
  END; 

Table

2 个答案:

答案 0 :(得分:1)

你的节目总是错的。我不认为它会曾经遵守过。请在下面查看工作版本:

DECLARE 
  v_empno emp.empno%TYPE;
  v_lname emp.ename%TYPE;
  v_salary emp.sal%TYPE;
  v_hiredate emp.hiredate%TYPE;
  v_newsalary number(8,2); 
  CURSOR c_emp IS 
    SELECT e1.empno, e1.ename, e1.sal, e1.hiredate 
    FROM emp e1, 
        (SELECT empno, TRUNC(MONTHS_BETWEEN(sysdate, hiredate)/12) years_of_service 
          FROM emp
        ) e2 
    WHERE e1.empno =e2.empno 
    and years_of_service >5; 
BEGIN
    OPEN c_emp; 
    LOOP
      FETCH c_emp  
      into v_empno, v_lname, v_salary, v_hiredate;

      v_newsalary := v_salary + (v_salary*.1);

      DBMS_OUTPUT.PUT_LINE( v_empno ||'  '||v_lname || ' ' || v_salary ||'  '||v_hiredate||'    '||'Due for a 10% raise'||'  '||v_newsalary);
      exit when c_emp%NOTFOUND;  
    END LOOP; 
    close c_emp;
  END; 

答案 1 :(得分:0)

我建议您完全不需要declare部分,因为您可以简单地将光标定义为

,而不是为您完成整个家庭作业。
for r in (
    select e.blah from employees e
)
loop
    do stuff here referring to r.blah
end loop;

(我总是使用r表示游标循环,i表示数字循环,除非有一些复杂的因素。)

另外,您不需要自我加入来检查hiredate < add_months(sysdate,-60)是否可以使用case表达式。

由于您刚刚开始,我还建议您选择小写的路径,因为它是2016年而不是1974年。