2011-11-14 11 views
0

に動作していないOracle関数以下、ROWNUMは

DROP FUNCTION get_mapper_requests; 

CREATE OR REPLACE FUNCTION get_mapper_requests(p_status IN NUMBER, p_rownum IN NUMBER) 
RETURN SYS_REFCURSOR 
AS 

CUR_MED_MAPPER_STATUS SYS_REFCURSOR; 

BEGIN 

dbms_output.put_line('Status Value:'||p_status); 

dbms_output.put_line('Row Count:'||p_rownum); 

OPEN CUR_MED_MAPPER_STATUS FOR SELECT cmd_id,status FROM CDFDBA.MED_COM_MAPPER_CMDS WHERE 
STATUS=p_status and ROWNUM < p_rownum; 

RETURN CUR_MED_MAPPER_STATUS; 

END; 

で上記の機能を見てください、私は変数p_rownumに任意の整数値を渡す場合にもかかわらず、すべてのレコードを返します。 p_rownum = 10であれば元の場合、この関数は

がサポートしてくださいブロック

DECLARE 

c SYS_REFCURSOR; 

v VARCHAR2(1000); 

v1 VARCHAR2(1000); 

BEGIN 

dbms_output.put_line('Hello'); 

c := get_mapper_requests(0, 10); 

LOOP 

    FETCH c INTO v,v1; 

    dbms_output.put_line('Value from cursor: '||v||' '||v1); 

END LOOP; 

CLOSE c; 

END; 
/

を呼び出すと、すべてのレコードを返します。

答えて

1

あなた私はあなたがそれがなければ

EXIT WHEN c%NOTFOUND; 

が欠けていると思う、呼び出し元のコードでFETCH後、私はあなたのコードは、ちょうどあなたがDBMSを充填するためのエラーを取得するまで、最後にフェッチ行にDBMS_OUTPUTを呼び出し続けると仮定したいです出力バッファ。

+0

驚くばかりです。それは今働いた。しかし、ここで私はカーソルが10の値を渡すときにカーソルが10のレコードしか持たないと仮定しました。この状況についてもっと詳しく教えてください。 – Hari

+0

'LOOP'は魔法のようにカーソルに縛られていません。したがって、明示的にループを壊す必要があります。あなたのカーソルは9行( '<10')をフェッチしていましたが、ループは永遠に続き、' v'と 'v1'は「未定義」(' NULL'を意味すると思います)に設定されています。つまり、フェッチが何も返さないとき(つまりカーソルの終わり)ループが抜けるということです。 – Sodved

0
declare 
    cursor c is select * from <table_name> where rownum < 15; -- SELECT ONLY 15 ROWS OF TABLE 
    type t is table of c%rowtype index by pls_integer; 
    tab t; 
begin 
    open c; 
    loop 
     fetch c bulk collect into tab limit 10; -- FETCH cursor in chunks of 10 
     dbms_output.put_line('X'); 
     exit when c%notfound; 
    end loop; 
end;