こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

PL/SQLでFORの働き

たびたびお世話になります。Oracle初心者で、PL/SQLを使ってすでに存在するレコードに順位の値を入れようと思っております。
DECLARE
CURSOR カーソル IS SELECT * FROM tb ORDER BY 成績;
n number:=0;
BEGIN
FOR r IN カーソル LOOP
UPDATE tb SET 順位=n
WHERE 成績=r.成績;
n:=n+1;
END LOOP;
END;
FORというもの自体がわからず恐縮です。これは正しく、カーソルで定義したORDER BYの順に動くと考えてもよいのでしょうか。上記を実際にやってみると、うまく順位が入るようなのですが、これはたまたまなのでしょうか。
お恥ずかしい限りですが、どうかよろしくお願いいたします。

投稿日時 - 2009-12-29 03:07:15

QNo.5554279

困ってます

質問者が選んだベストアンサー

> カーソルで定義したORDER BYの順に動くと考えてもよいのでしょうか。
カーソルで定義したORDER BYの順に処理されます。

> うまく順位が入るようなのですが、これはたまたまなのでしょうか。
たまたま、成績の値が重複しなかったからでしょう。
重複した成績の値を持つデータを作ってテストしてみてください。

例のようにプログラムするとすれば、私なら……

DECLARE
CURSOR カーソル IS
SELECT 成績, count(*) as cnt FROM tb
GROUP BY 成績
ORDER BY 成績;
n number := 1;
BEGIN
FOR r IN カーソル LOOP
UPDATE tb SET 順位 = n
WHERE 成績 = r.成績;
n := n + r.cnt;
END LOOP;
END;

# 順位だから1から始まるようにしています。

投稿日時 - 2009-12-29 04:33:45

お礼

dda167様 前回に引き続き、ありがとうございます。

おっしゃるとおり、重複したデータの場合、両方とも大きな値でおかしくなってしまいました。
r.cntでは、重複している数を出しているのですね。

よく理解できました。
ご親切に対応していただき、感謝しております。
ありがとうございました。

投稿日時 - 2009-12-29 09:09:03

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問