2017-06-02 149 views
0

我正在嘗試創建包和程序,我找到所有以MA或SA開頭的工作,如果他們的工資低於平均水平薪水,然後增加他們的工資33%。如果員工平均工資低於平均水平,可以獲得員工平均工資

我找不到問題並使其工作。

下面是代碼,無法得到它的工作:

create or replace package body name2 as 
procedure one(
alga emp.sal%type, 
new_sal emp.sal%type) 
cursor kursors1 is 
select ename, sal from emp where job LIKE 'MA%' OR e.job LIKE 'SA%' for update sal; 
begin 
select round(avg(sal),2) videja_alga into alga from emp 
for darb in kursors1 
loop 
if darb.sal < alga then 
new_sal:=darb.sal+(darb.sal*0.33); 
dbms_output.put_line('New sal: ' || darb.sal); 
update emp set sal = new_sal where current of kursors1; 
end if; 
end loop; 
end; 
end name2; 
/
+0

你真的想做pl/sql嗎?不是Sql語句?更新emp設置sal = sal * 0.33其中(作業像'MA%'或e.job LIKE'SA%')和sal <(從emp選擇avg(薪水)) –

回答

0

請把正確的下一次。否則很難解釋。

CREATE OR REPLACE PACKAGE BODY name2 
AS 
    PROCEDURE one (alga emp.sal%TYPE, new_sal emp.sal%TYPE) 
    AS 
     CURSOR kursors1 
     IS 
     SELECT ename, sal 
      FROM emp 
      WHERE job LIKE 'MA%' OR e.job LIKE 'SA%'; 
    BEGIN 
     SELECT ROUND (AVG (sal), 2) videja_alga 
     INTO alga 
     FROM emp; 

     FOR darb IN kursors1 
     LOOP 
     IF darb.sal < alga 
     THEN 
      new_sal := darb.sal + (darb.sal * 0.33); 
      DBMS_OUTPUT.put_line ('New sal: ' || darb.sal); 

      UPDATE emp 
       SET sal = new_sal 
      WHERE CURRENT OF kursors1; 
     END IF; 
     END LOOP; 
    END; 
END name2; 

變化做:

  1. 刪除從遊標更新SAL。我不確定它是如何簡單循環的。
  2. ';'在平均值計算中缺少選擇語句
  3. 在遊標聲明之前添加了'as',因爲它是標準程序創建的一部分。

這整個代碼可以做得少得多,嘗試使用分區,這將給你在遊標本身的平均值,你可以在光標本身進行計算,只需要更新下面,將循環通過光標。

+0

更新他用於update子句,他在哪裏使用「哪裏有電流」。在正確的情況下非常有用。 –

+0

感謝您的澄清。 – Debabrata