2016-07-16 49 views
0

我有一張名爲employees的表。我正在嘗試創建一個匿名PLSQL塊,輸出僱員表中僱員的姓氏,工資和僱用名稱。如果僱員僱用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

+0

那麼是什麼問題?你有沒有得到任何錯誤? – Hawk

+0

我確實收到了一些錯誤,但它告訴我我錯誤地使用了遊標並沒有編譯。 – Venom

回答

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; 
+0

感謝您的更正。搜索每一行後,我忘記關閉光標! – Venom

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年

+0

我一直都看到爲大寫SQL編寫的代碼。它使它更容易。我認爲這是人們編寫SQL時的一種風格選擇。案例表達式如何爲這個實現工作?我真的很感興趣知道如何下次如果我遇到它,我會知道如何工作。 – Venom

+0

我也看到很多SQL寫了很多方法。我曾經告訴自己,大寫關鍵字使得它更易於閱讀,直到我意識到它實際上沒有。關於你的僱傭表達,只要在你的選擇列表中有'when blah <無論什麼'Y'end'的情況,就不需要連接。 –

+0

那麼這將在第一個where子句或from子句中出現?我認爲如果我把它放在where子句中會很有意義。 – Venom

相關問題