2016-10-12 6 views
0

私はループの周りにいくつかのコードを構築する必要があり、それは巨大になるだろう。必要以上の敵を作らないために、わかりやすくするためにコードを分割したいと考えています。実際の生活の中で二行目は、本当に私は他の関数に私のカーソルcur_tblAを渡したいたくさんあるのでループカーソル(現在の行)を別の関数/プロシージャに渡すにはどうすればいいですか?

FOR cur_tblA IN (SELECT col1, col2 FROM tblA) LOOP 
    -- a lot of stuff 
    NULL; 
END LOOP; 

私のコードは、そのように見えます。私はcur_tblAの値が現在の行であると私は私の他の関数/プロシージャでcur_tblA.col1などのような値にアクセスできることを期待する:

FUNCTION do_stuff(cur_tblA) RETURN VARCHAR2 AS BEGIN 
    return cur_tblA.col1; 
END do_stuff; 

cur_tblAを受信するための署名のための右のタイプは何ですか?

答えて

1

このタイプのカーソルループで直接行うことはできませんが、パッケージに定義されているレコードタイプでopen/fetchを使用できます。以下のようなもの:

TYPE rec_type IS RECORD (col1 tblA.col1%TYPE, col2 tblA.col2%TYPE); 

は、その後、あなたのメインの手順では、その型の変数を宣言し、それにフェッチ:

rec rec_type; 
... 
OPEN cur_tblA FOR SELECT col1, col2 FROM tblA; 
LOOP 
    FETCH cur_tblA INTO rec 
    EXIT WHEN cur_tblA%NOTFOUND; 
    do_stuff(rec); 
END LOOP; 

サブ関数の宣言は次のようになります。

FUNCTION do_stuff(p_rec rec_type) RETURN VARCHAR2 AS BEGIN 
    return p_rec.col1; 
END do_stuff; 

ますレコードのコレクションを定義して渡すこともできます(これがさらに処理するのに適切な場合)。また、プロシージャー/ファンクションが必ずしもすべて同じパッケージ内にある必要はありません。タイプがパッケージ仕様で公に宣言されている場合は、your_package.rec_typeを参照することができます。この場合、彼らはすべて一緒になるように聞こえるが。

関連する問題