寝て起きて寝て

プログラミングが出来ない情報系のブログ

CURSORメモ(PL/SQL)

PL/SQLでカーソルを使ったときにはまったのでメモ

環境

Oracle Database 11g

何をしたいか

全従業員の給料はテーブルEmployeeに入っている

・従業員の平均給料より高い場合 現在の給料を2倍にし、テーブルScoreにInsert

・従業員の平均給料以下の場合 現在の給料を1.5倍、テーブルScoreにInsert

テーブル

テーブル名:Employee

no salary
1 10000
2 15000
3 25000
4 18000
5 20000

テーブル名:Score

no new_salary

なにで詰まったか

下記のようにPL/SQLを書いた。

DECLARE
  a  NUMBER;
  sa NUMBER;
  em NUMBER;
  CURSOR curs IS SELECT salary,no INTO sa, em FROM Employee;
BEGIN
  SELECT AVG(salary) INTO a FROM Employee;
  FOR i IN curs LOOP
    IF a >= sa THEN
      INSERT INTO Score(new_salary,no) VALUES(sa*1.5,em);
    ELSIF a < sa THEN
      INSERT INTO Score(new_salary,no) VALUES(sa*2,em);
    END IF;
  END LOOP;
END;
/

エラー自体は出なかったが、なにもInsertされていなかった。

原因と解決方法

恐らくカーソル内でINTOできない

DECLARE
  a  NUMBER;
  CURSOR curs IS SELECT salary,no FROM Employee;
BEGIN
  SELECT AVG(salary) INTO a FROM Employee;
  FOR i IN curs LOOP
    IF a >= i.salary THEN
      INSERT INTO Score(new_salary,no) VALUES(i.salary*1.5,i.no);
    ELSIF a < i.salary THEN
      INSERT INTO Score(new_salary,no) VALUES(i.salary*2,i.no);
    END IF;
  END LOOP;
END;
/

これでInsertされた。

ただ、単純に見にくいしたぶんもっとやり方があるんだろうなぁ・・・