2017-06-09 8 views
0

を通じて私は私が一度に5を表示し、look_item_cursorするためにそれを設定しようとしている複数のLOCATION_NAMEエントリを持っている私のカーソルPL SQL - ループのカーソル

をループの問題を抱えています。

CURSOR look_item_cursor IS 

    SELECT * 
    FROM (SELECT DISTINCT location_name 
      FROM inventory_info_v i 
      WHERE i.item_code = lr_item.item_code) a 
    WHERE rownum <= (ln_page + 4) 
    AND rownum >= ln_page; 

元のクエリは正常にデータを返します。 ln_pageとlr_item.item_codeの両方は、カーソルが呼び出された時点で埋められます。私は一般的な例外ときに取得していますが

は私が

look_item_cursor%ROWTYPE 

として割り当てられているlv_location_nameと

OPEN look_item_cursor; 
     BEGIN 
     FOR lv_location_name IN look_item_cursor LOOP 
      pv_message_return := pv_message_return || 
           lv_location_name.location_name; 
     END LOOP; 
     END; 
CLOSE look_item_cursor; 

で、5返さLOCATION_NAME、一度に一つのそれぞれを取得しようそれはクエリを実行し、なぜ私は分からない。どんな助けもありがとう!

+0

**完全なスタックトレースを投稿してください。 – OldProgrammer

+0

カーソル 'FOR'ループを使用している場合(あなたの例ではしようとしています)、1.カーソルを明示的にオープンしないでください(カーソル' FOR'ループがあなたのために行います)。 2. 'lv_location_name'変数(カーソル' FOR'ループはあなたのために行います)と同じように、カーソルループ変数を明示的に宣言しないでください。つまり、カーソルを明示的に開くか、明示的にフェッチして閉じるか、カーソルの 'FOR'ループを使用します。これはほとんどの作業を行います(カーソルをオープンし、カーソル変数を宣言し、カーソルをフェッチして閉じます)。 –

+0

非常に参考になりました、ありがとうございます。このタイプのループには「終了時」を含める必要がありますか?私は5番目と最後のエントリを割り当てると、エラーがあるので尋ねるEDIT:それは愚かなことだった気がしない。 –

答えて

0

LOOP文
LOOP文のカーソルが暗黙的に指定されたカーソルに戻り、その後、カーソルをオープン行タイプのレコード変数としてのループインデックスを宣言するためのカーソル

oradocから。各反復で、カーソルFOR LOOP文は、結果セットから行をレコードにフェッチします。フェッチする行がなくなると、カーソルFOR LOOP文がカーソルを閉じます。ループ内の文がループ外で制御を移したり、例外を発生させたりすると、カーソルも閉じます。

in (...) loop)内部クエリとテストデータを交換する(このようなものを試してみてください:

begin 
    for row_ in (
     select 1 id, 'item 1' name from dual union all  
     select 2 id, 'item 2' name from dual union all  
     select 3 id, 'item 3' name from dual 
     ) loop 
     dbms_output.put_line('id:'||row_.id||' name:'||row_.name); 
    end loop; 
end; 

-- dbms output 
id:1 name:item 1 
id:2 name:item 2 
id:3 name:item 3 
0

このコードカーソルが二回開かれた取得する作っている:

OPEN look_item_cursor で明示的に
  • 暗黙的に初期化中FOR-LOOP

ORA-06511: PL/SQL Cursor already openの例外があるとします。 これを避けるには、OPEN文とCLOSE文を削除してください。カーソルをループ内で使用するだけで、自動的に開閉が行われます。


私がコードに気づくいくつかの問題-メーカーを警戒する必要がある:ループ変数の宣言

  1. は必要ありません。宣言セクションから削除してください。FOR-LOOPでローカルに使用してください。

  2. 外側のcontexから変数ln_pageを渡す場合は、厳密にはcursor parameter passingで修正する必要があります。

  3. rownum(AND rownum >= ln_page)の下限は期待どおりに機能しません。Oracle 12cではLIMIT ROWS句を使用します。それ以外の場合は、行番号のインライン・ビューが必要です。どちらの場合も特にhereと記載されています。

+0

ありがとうございました。これは@Nicholas Krasnovのコメントごとに解決されました。とても助かりました、ありがとう –

関連する問題