2

%ROWTYPE 属性を使用して PL/SQL でレコードを定義することをお勧めします。これにより、入力の手間が省け、列が追加または削除された場合でもパッケージが機能し続けることができます。(間違っていたら訂正してください!)

ただし、結合を含むカーソルからフェッチする場合、結合によって返されるすべての列の (かなり長い可能性がある) 手書きのリストを含むプログラマ定義のレコードにフェッチする必要があることがわかりました。

だから私の質問は次のとおりです。ネストされたレコードにフェッチしたり、レコードのリストにフェッチしたり、そのような醜いクラッジを回避するために何かをしたりすることは可能ですか? 私が試したことはすべて、レコードがカーソルによって返されたものと一致しないというエラーにつながります。

カーソルを使用して結合の結果を返すことは、私には非常に一般的なユースケースのように思えますが、これに関連するものが検索に表示されないのは奇妙です。

ありがとうございました。

4

2 に答える 2

8

cursor%rowtype を使用できます。

サンプル:

declare
cursor c_c is
select emp.*, dept.* -- use aliasses if columns have same name
from emp
,    dept; -- for sample no join condition

r_c c_c%rowtype; 

begin
  for r_c in c_c loop -- with for loop even the definition of r_c is not needed.
  ...
  end loop;
end;
/
于 2009-02-26T05:49:32.430 に答える
5

なぜわざわざカーソル宣言をするのでしょうか?

これは同等です。

begin
  for r_c in (select emp.*, dept.* from emp, dept) loop
  ...
  end loop;
end;

あなたのコメントであなたがこれに言及していることがわかります。しかし、明示的なカーソル構文が非常に多く使用されていることがわかります。それを示すことが重要だと思います。

于 2009-02-26T13:59:55.947 に答える