2012-03-19 22 views
2

プロシージャから2つのREFカーソルを戻そうとしましたが、少し問題があります。私がしようとしているのは、最初のカーソルから情報を取得し、そこからいくつかのフィールドを選択して他の情報に結合し、その結果をテーブル変数に貼り付けることです...次に、カーソル。しかし、私はこれをコンパイルすることはできません。誰かが私が間違ってやっていることを教えてもらえますか?Oracle 11g:プロシージャ内でのカーソルの使用

type T_CURSOR is REF CURSOR 

procedure FetchSL3Details_PRC 
(
c_items out T_CURSOR, 
c_identifiers out T_CURSOR, 
p_niin in char 
) as 
v_idents IDENTIFIER_TABLE_TYPE:= IDENTIFIER_TABLE_TYPE(); 
BEGIN 

open c_items for 
    select 
    its.item_set_id, 
    its.niin, 
    its.parent_niin, 
    its.commodity_id, 
    its.service_type, 
    its.sl3_type, 
    its.qty, 
    its.created_id, 
    its.created_dt, 
    its.modified_id, 
    its.modified_dt 
    from 
    item_set its 
    start with its.niin = p_niin 
    connect by prior its.niin = its.parent_niin; 

    for item in c_items loop 
    v_idents.extend; 
    v_idents(v_idents.LAST) := identifier_row_type(item.commodity_id, 
                 get_group_name_fun(item.commodity_id), 
                 0); 
    v_idents.extend; 
    v_idents(v_idents.LAST) := identifier_row_type(item.created_id, 
                 get_formatted_name_fun(item.created_id), 
                 0); 
    v_idents.extend; 
    v_idents(v_idents.LAST) := identifier_row_type(item.modified_id, 
                 get_formatted_name_fun(item.modified_id), 
                 0); 
    end loop; 

    open c_identifiers for 
    select 
     distinct(v.id), 
     v.name, 
     v.type 
    from 
     v_idents v; 

END FetchSL3Details_PRC; 
+0

T_CURSORとは何ですか?私は一般に、オープン・カーソルを保持する変数の型としてsys_refcursorを使用します。 –

+0

エラーコードとは何ですか? –

+0

T_CURSORは参照カーソルのtypedefです... – Sam

答えて

4

あなたはこの構文を使用することはできません。 c_itemsは標準のPL/SQL CURSORになると予想しています。それはあなたが得ているエラーの直接の原因です。私が知る限り、REF CURSORをループしたい場合は、明示的なFETCHステートメントを使用してループ状態を処理する必要があります。

さらに、あなたがしようとしていることは、あまり意味がありません。プロシージャの本体内のc_itemsカーソルからフェッチした場合、呼び出し元にもカーソルを戻すと混乱します。あなたのコメントでは、 "カーソルに選択"というフレーズを使用しています。これは、カーソルを静的なコレクションとして考えることを繰り返し、繰り返し繰り返すことができることを意味します。これはそうではありません - カーソルはメモリ内のアクティブなクエリを表します。一度行がカーソルから取り出されると、それは再びフェッチできません。

私はコードの最終目標を理解していないので、正確に何を提案するのか分かりません。 c_itemsの行を処理して、それを使用可能なREF CURSORとして返す必要がある場合は、それを閉じて再度開くことが唯一のオプションです。

1

変更この:

open c_identifiers for 
    select 
     distinct(v.id), 
     v.name, 
     v.type 
    from 
     v_idents v; 

には:REF CURSORで

for item in c_items loop 

open c_identifiers for 
    select 
     distinct(v.id), 
     v.name, 
     v.type 
    from 
     TABLE(v_idents) v; -- Use TABLE 
+0

おかげで、tempテーブルの部分が固定されています...まだループのc_itemsカーソルからアイテムを取得できないという問題があります。そのテーブル。 – Sam

関連する問題