我有一张叫员工的桌子。我正在尝试创建一个匿名的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;
答案 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年。