![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
たびたびお世話になります。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の順に動くと考えてもよいのでしょうか。上記を実際にやってみると、うまく順位が入るようなのですが、これはたまたまなのでしょうか。
お恥ずかしい限りですが、どうかよろしくお願いいたします。
No.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から始まるようにしています。
dda167様 前回に引き続き、ありがとうございます。
おっしゃるとおり、重複したデータの場合、両方とも大きな値でおかしくなってしまいました。
r.cntでは、重複している数を出しているのですね。
よく理解できました。
ご親切に対応していただき、感謝しております。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
カーソル定義での条件分岐
-
ORA-00904:無効な識別子の回避...
-
PL/SQLでのSQL文法
-
自動連番でカラムを更新したい
-
Access VBAで行ラベルが定義さ...
-
Accessのマクロでモジュールを...
-
VBA プロシージャの名前の取得
-
callで順に実行されるプロシー...
-
エクセルVBAでUserFormを起動し...
-
キャッシュを使わずにSELECTを...
-
日付型カラムへのデータINSERT
-
DBMS_OUTPUT.PUT_LINEを実行し...
-
異なるスキーマのビューを元に...
-
likeとsubstrの使いわけについて
-
百の位での四捨五入について
-
wordの差し込み印刷での日付表示
-
Accessの数値から時間に変換す...
-
sqlplusでヘッダーが付かない
-
SQLサーバで和暦から西暦に変換...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
PL/SQLカーソルの2重FORループ...
-
PL/SQLでのSQL文法
-
Texの枠囲み調節
-
カーソル定義での条件分岐
-
自動連番でカラムを更新したい
-
ORA-00904:無効な識別子の回避...
-
カーソルフェッチにて、最終レ...
-
【PL/SQL】LOOPした動的SQLにて...
-
ROW_NUMBER BY PL/SQL
-
【PL/SQL】CURSOR ・・・ IS SE...
-
[Oracle9i]PL/SQLでFETCHしても...
-
PL/SQL カーソルのFROM句にカー...
-
minipage??
-
MYSQL ストアドプロシージャの...
-
カーソルループ内部でログを出力
-
mysqlのcase文で複数の条件を指...
-
PL/SQLのカーソルについて
-
T-SQLのカーソルで
-
Accessのマクロでモジュールを...
-
Access VBAで行ラベルが定義さ...
おすすめ情報