获得员工平均工资的程序,如果低于平均工资则增加

时间:2017-06-02 11:05:17

标签: oracle

我正在尝试创建一个程序包和程序,我找到所有从事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;
/

1 个答案:

答案 0 :(得分: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. &#39 ;;&#39; avg计算选择陈述中缺少
  3. 添加&#39; as&#39;在游标声明之前,因为它是标准过程创建的一部分。
  4. 这整个代码可以用更少的方式完成,尝试使用分区,它会在光标本身给你avg值,你可以在光标本身进行计算,只需要一个更新,下面将循环遍历光标。 / p>