2011-11-14 33 views
0

请看看下面的Oracle函数,ROWNUM在Oracle SQL查询的光标不工作

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

后您FETCH调用代码,我认为你错过了

EXIT WHEN c%NOTFOUND; 

如果没有,我会想你的代码只是不断呼吁DBMS_OUTPUT与上次提取行,直到你得到一个错误的填充DBMS输出缓冲区。

+0

太棒了。它现在有效。但是在这里,我假定光标将只有10条记录,当我将该值传递给10时,能否详细说明这种情况? – Hari

+0

'LOOP'并不神奇地与游标绑定。所以你需要明确地打破我们的循环。你的光标获取了9行('<10'),但循环一直持续下去,'v'和'v1'设置为“undefined”(我认为这意味着'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;