2017-06-02 91 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