2

50 件の結果を返す選択クエリがあります。選択クエリは id を返します。

次の部分では、50 個すべての ID の値を選択するクエリを実行する必要があります。

誰かがそれを成し遂げるための最良の方法を教えてください。forループを使用するのは良い考えです。

begin
declare  @count= select id from table1 
 for 1 to @count ..loop
   select value from table2 where id =1
end loop

最良の方法は何ですか?

4

3 に答える 3

4

このステートメントについて詳しく説明してください。「次の部分では、50 個すべての ID に値する選択クエリを実行する必要があります。」ただし、これらの 50 個のレコードを pl/sql ブロッ​​クでフェッチして何らかの方法で操作する場合は、カーソルが必要になります。カーソルからのレコードは、FOR ループの有無にかかわらずフェッチできます。

カーソルの例:

declare
 cursor c1 is select col1 from table1;
begin
 for a in c1
  loop
   dbms_output.put_line(a.col1);
  end loop;
end;

上記のコードは、サーバー出力がオンの場合、col1 の値を表示します。

于 2013-09-04T14:04:37.293 に答える
3

あなたが提案するような単純なケースでは、値のコレクションを構築し、それらを繰り返し処理して2番目のテーブルからデータを取得するのは悪い考えだと思います。JOIN を使用して、任意の基準に基づいて 2 つのテーブルのデータを結合することをお勧めします。この場合、TABLE2 にもある TABLE1 から ID 値を選択しているように見えます。したがって、次のようなものを検討できます。

FOR myRow IN (SELECT t1.ID, t2.VALUE
                FROM TABLE1 t1
                INNER JOIN TABLE2 t2
                  ON (t2.ID = t1.ID))
LOOP
  -- Do something useful with the data

  DBMS_OUTPUT.PUT_LINE('t1.ID=' || myRow.ID || '  t2.VALUE=' || t2.VALUE);
END LOOP;

共有してお楽しみください。

于 2013-09-05T01:47:14.253 に答える
0

以下に示すのは良い方法です

declare
cursor c1 is select value from table2 where id in (select id from table1)
begin
for i in c1
loop
...
...
end loop;
end;
于 2013-09-04T17:02:15.667 に答える