• ベストアンサー

ループの仕方

select文で、まずデータが何件あるかカウントしたあと、 そのカウントした数の分だけ、ループしたいです。 ループに入れ込みたいSQLは以下のような感じです。 1.select 1a,1b from TABLE1 where 条件; 2.select 2a,2b from TABLE2 where 条件; カウントした数の受け渡しとかも、分からないような状態なのですが、 初心者向けに教えていただけないでしょうか。 宜しくお願いします。

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

  • ベストアンサー
  • yoko3333
  • ベストアンサー率35% (47/134)
回答No.2

お返事が遅くなって申し訳ございませんでした。 ちょっと仕事でバタバタしてたもので・・・。 で、回答なのですが・・・Update文ならわかるのですが、SELECT文はわかりません(>_<) ごめんなさい~。 とりあえず、Update文の場合です。(Ora8.1.7にて確認。) -------------------------------------------------- DECLARE wCount NUMBER(3); wLoop NUMBER(3); CURSOR CSR1 IS SELECT Count(*) As 件数 FROM テーブル名1; BEGIN OPEN CSR1; FETCH CSR1 INTO wCount; CLOSE CSR1; FOR wLoop IN 1..wCount LOOP UPDATE テーブル名2 SET フィールド名=値; END LOOP; COMMIT; END; / -------------------------------------------------- 単純にUpdate文のところをSelectにしてみると、エラーになっちゃうんですよね・・・。 うーん・・・。

moritaka6280
質問者

補足

もしかしたら、"DECLARE~bigin~end"、この文を打つ権限が無いかもしれないです~。 (今、上の人に確認してもらってます) 文だけ読むと、 内容的には、こんな感じの事がしたい!って感じです。

その他の回答 (2)

  • yoko3333
  • ベストアンサー率35% (47/134)
回答No.3

たびたびすみません。 ちょっと思いつきました。 ------------------------------------------------------------------- set echo off set sqlprompt "--[SPOOLING...]> " set heading off set feed off set timing off set pages 0 spool temp.sql SELECT 'SELECT 1a,1b,1c FROM TABLE1 WHERE 1a ='||count(TblB.TABLEのキー)||';' ||chr(10)|| 'SELECT 2a,2b,2c FROM TABLE2 WHERE 2a='||count(TblB.TABLEのキー)||';' FROM TABLE TblA, TABLE TblB WHERE TblA.TABLEのキー>=TblB.TABLEのキー GROUP BY TblA.TABLEのキー; spool off set heading on set feed on set timing on set pages 1000 SET SQLPROMPT "SQL> " set echo on @temp ------------------------------------------------------------------- spoolファイルを使ってみました。 一度、「temp.sql」というファイルにSQL文を書き出して、「@temp」でそのSQL文を実行しています。 SQL文を見て見たければ、「temp.sql」を自分でわかりやすいファイル名に変更して spool c:\test.sql (省略) @c:\test.sql とやってみてください。 連番を取得するのために、SQL文が複雑になってます。 単純に SELECT 'SELECT 1a,1b,1c FROM TABLE1 WHERE 1a ='||rownum||';' ||chr(10)|| 'SELECT 2a,2b,2c FROM TABLE2 WHERE 2a='||rownum||';' FROM TABLE; でもOKなような気もしますが・・・rownumがどんな場合でもきちんと1から連番になってくれる のかはっきりしなかったので、今回は見送りました。 不明な点がありましたら書きこんでください。 (またお返事が遅くなるかもしれませんが・・・。)

moritaka6280
質問者

お礼

いろいろ検討してくださって、ありがとうございました。 もう少し、自分でも調べてみたいとおもいます。

  • yoko3333
  • ベストアンサー率35% (47/134)
回答No.1

補足をお願いします。 Oracleのバージョンはなんですか? プログラムはどこに書いて、実行するのには何のツールを使いますか? (SQLPlus?ストアドプロシージャ?トリガー?VB?Access?) 具体的に決まっていないのであれば、どういう状況で、どうしてその 処理を実行したいのか、また何度も繰り返し行うのか・・・等の詳細を 教えてください。 > ループに入れ込みたいSQLは以下のような感じです。 > 1.select 1a,1b from TABLE1 where 条件; > 2.select 2a,2b from TABLE2 where 条件; ということは、データの件数分SELECT文を発行する = 条件にあう データを表示するだけ ですか??更新等ではなく? また、この意味は、1件目で「select 1a,1b from・・・」、2件目では 「select 2a,2b from・・・」、3件目「select 3a,3b from・・・」 ということでしょうか?

moritaka6280
質問者

お礼

やりたい事のイメージとして、 select count(*) from TABLE; COUNT(*) ----------  5 ↓ このカウントされた5を元に、 1から5までをループを回す select 1a,1b,1c from TABLE1 where 1a = 1~5; select 2a,2b,2c from TABLE2 where 2a = 1~5; しかし、 上のselect文を1~5までループして後に、 下のselect文がスタートするのではなく。(図1) (図1) 1a | 1b | 1c   ←上のセレクト文 --------------- 1 1a | 1b | 1c --------------- 2 ・ ・ ・ 2a | 2b | 2c   ←下のセレクト文 --------------- 1 2a | 2b | 2c --------------- 2 ・ ・ ・ 上のselect文の1が発行されたら、下も1を発行し、 つづいて2,3,…という風に交互に表示したいのです。(図2) (図2) 1a | 1b | 1c   ←上のセレクト文 --------------- 1 2a | 2b | 2c   ←下のセレクト文 --------------- 1 1a | 1b | 1c   ←上 --------------- 2 2a | 2b | 2c   ←下 --------------- 2 ・ ・ ・ webなどを探しても、同じ例が見つけられなかったので、 宜しくお願いします。

moritaka6280
質問者

補足

補足します。 oracle10gで、SqlPlusを使っています。 やりたいことはselect文発行のみです。(それ以上の権限が無いもので...) カウントされたデータの数が9であれば、 1.と2.の両方とも9回ループしたいという意味です。 言葉不足のヤヤコシイ表現になっていまい、すみません。_(._.)_ また説明不足な点がありましたら、補足させていただきます。 よろしくおねがいします。