2017-06-02 3 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文ではありませんか? (MA%またはe.job LIKE 'SA%'のようなジョブ)とsal(empからの平均(給与)を選択) –

答えて

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; 

行われた変更:カーソルからの更新SALのために削除さ

  1. 。私はあなたが単にそれをループしているように何をしているのか分かりません。
  2. ';'
  3. 標準プロシージャ作成の一部であるため、カーソル宣言の前に 'as'を追加しました。

このコード全体はずっと少なくすることができます。パーティションを使用すると、カーソル自体に平均値が与えられます。下のアップデートでカーソル自体の計算を行うことができます。カーソル。

+0

彼が更新句に使用しているforの更新は、ここで彼はどこの "現在の"を使用しています。適切な状況で非常に便利です。 –

+0

その説明をありがとう。 – Debabrata

関連する問題