2009-05-03 10 views
1

私は、SQL-開発者にこのストアドプロシージャを実行したときに、私は何を参照してくださいいけない、しかし次のOracleのストアドプロシージャoracleストアドプロシージャ(カーソルあり)はどのように機能しますか?

CREATE OR REPLACE 
PROCEDURE getRejectedReasons 
    (
    p_cursor IN OUT SYS_REFCURSOR) 
AS 
BEGIN 
    OPEN p_cursor FOR SELECT * FROM reasons_for_rejection; 
END; 

を持っています。私は、MS SQLサーバから来ていると、このようなストアドプロシージャを実行するときに実際の結果を見慣れてい

Connecting to the database oracleLocal. 
Process exited. 
Disconnecting from the database oracleLocal. 

:私はちょうどこのような何かを参照してください。私はカーソルを使用しているので、このストアドプロシージャは結果を返さないのですか?

答えて

1

カーソルを開いた。そこから何かを選択したり、更新したり、進めたりしませんでした。

すべてのopenは、一致する行を一時メモリに選択するため、行ごとにカーソルを進めることができます。あなたはしていない。

+0

どのようにi「事前」することができます私はそれを実行すると結果を表示するので、カーソル。 –

+0

さて、あなたはしません。つまり、カーソルの全体のポイントは、一度に1つの行しか表示されず、多くの行の結果セット全体ではありません。 'for rec_p_cursor loop' 'end loop;でループすることができます。 – tpdi

+0

OK、このストアドプロシージャはJavaコードのiBatisファイルで使用します。だから私はそこにカーソル全体を取得してループすることができると思います –

0

OracleとSQL Serverの違いの1つは、後者が結果セットを自然に返すことです。私は関数を使用します。

Oracleでは、通常、関数は単一の要素を戻します。カーソルは後で来た。

refcursorバインド変数の使用方法を理解するのに役立つオンラインマニュアルがあります。ここでは、SQL * Plusのように一つだ:私はそれをテストしていませんが、

http://download.oracle.com/docs/cd/B19306_01/server.102/b14357/ch5.htm#sthref1122

私は、SQL Developerで使用すると、上の自動印刷と同じことを行うことができると思います。

http://vadimtropashko.wordpress.com/cursors/

+0

pl/sqlカーソルは単一の要素です.pl/sql関数はカーソルを返すことができます。 – tuinstoel

-1

ETA:[OK]を

も似たような議論のブログを見つけました。私が書いたものを無視する。他の人の言葉を聞く。どうやらそれは間違っています。

tpdiが正しいと言いました。宣言したら、カーソルで何かをしなければなりません。

はここでストアドプロシージャが、それはちょうどあなたが結果を使って何をやっていない何かを返しているネストされたループ

PROCEDURE update_insert_tree (exid_in IN NUMBER, outvar_out OUT VARCHAR2) 
    IS 
     nxtid   NUMBER; 
     phaseid  NUMBER; 
     rowcounter1 NUMBER; 
    BEGIN 
     rowcounter1 := 0; 
     outvar_out := 0; 

     FOR acur IN (SELECT dept_exercise_id, phase 
        FROM ep_dept_exercise 
        WHERE exercise_id = exid_in) 
     LOOP 

     <<dept_loop>> 
     FOR thecur IN (SELECT document_name, thelevel, sortnum, type_flag, 
           ex_save_id 
          FROM ep_exercise_save 
         WHERE exercise_id = exid_in) 
     LOOP 
      phaseid := acur.phase; 

      IF phaseid = 0 
      THEN 
       phaseid := 10; 

       UPDATE ep_dept_exercise 
        SET phase = 10 
       WHERE dept_exercise_id = acur.dept_exercise_id; 
      END IF; 

      <<doc_loop>> 
5

で2つのカーソルを使用した例です。

あなたは単にのsqldeveloperで次のスクリプトを実行することによってこれを行うことができます。


VARIABLE csr REFCURSOR; 
EXEC getRejectedReasons(:csr); -- the colon identifies the parameter as a variable 
PRINT csr; 

別の方法は、それぞれの行をフェッチし、処理のいくつかの並べ替えを行うことです。


DECLARE 
    -- sys_refcursor is weakly typed 
    refcsr SYS_REFCURSOR; 
    -- define a record so we can reference the fields 
    rej_rec Reasons_for_Rejection%ROWTYPE; 
BEGIN 

    getRejectedReasons(refcsr); 

    -- loop through the results 
    LOOP 
     -- gets one row at a time 
     FETCH refcsr INTO rej_rec; 
     -- if the fetch doesn't find any more rows exit the loop 
     EXIT WHEN refcsr%NOTFOUND; 
     -- Do something here. 
     -- For example : DBMS_OUTPUT.PUT_LINE(rej_rec.reason_desc); 
    END LOOP; 

END; 
関連する問題