1

次のオラクルストアドプロシージャがあります

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

ただし、このストアド プロシージャを sql-developer で実行すると、何も表示されません。私はちょうどこのようなものを見ます:

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

私は MS sql サーバーから来て、このようなストアド プロシージャを実行するときに実際の結果を確認することに慣れています。カーソルを使用しているため、このストアド プロシージャは結果を返さないのでしょうか??

4

4 に答える 4

5

ストアド プロシージャは何かを返しています。結果に対して何もしていないだけです。

これは、SQLDeveloper で次のスクリプトを実行するだけで実行できます。


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

もう 1 つの方法は、各行をフェッチして何らかの処理を行うことです。


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;
于 2009-05-03T20:46:39.537 に答える
1

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

すべてのオープンは、事実上、一致する行を一時メモリに選択するため、カーソルを行ごとに進めることができます。あなたがしなかったこと。

于 2009-05-03T16:54:04.777 に答える