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された。
ただ、単純に見にくいしたぶんもっとやり方があるんだろうなぁ・・・