電子書籍の厳選無料作品が豊富!

たびたびお世話になります。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の順に動くと考えてもよいのでしょうか。上記を実際にやってみると、うまく順位が入るようなのですが、これはたまたまなのでしょうか。
お恥ずかしい限りですが、どうかよろしくお願いいたします。

A 回答 (1件)

> カーソルで定義した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から始まるようにしています。
    • good
    • 0
この回答へのお礼

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

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

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

お礼日時:2009/12/29 09:09

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す