我正在調用PLSQL存儲過程來檢索和操作信息的Web應用程序。在這種情況下,數據庫有兩個存儲過程;一個選擇一組給定參數的記錄總數,一個返回具有相同參數的實際記錄,再加上分頁參數(最小和最大rownum)。
EX(而不是實際的代碼):
PROCEDURE get_records_count(
p_first_name IN record_table.first_name%TYPE,
p_last_name IN record_table.last_name%TYPE,
p_resultCursor OUT sys_refcursor
)
IS BEGIN
OPEN p_resultCursor FOR
SELECT count(*) from record_table
WHERE first_name LIKE (p_first_name || '%')
OR last_name LIKE (p_last_name || '%');
END;
PROCEDURE get_records(
p_first_name IN record_table.first_name%TYPE,
p_last_name IN record_table.last_name%TYPE,
p_min IN NUMBER,
p_max IN NUMBER,
p_resultCursor OUT sys_refcursor
)
IS BEGIN
OPEN p_resultCursor FOR
SELECT * from record_table
WHERE first_name LIKE (p_first_name || '%')
OR last_name LIKE (p_last_name || '%')
AND rownum >= p_min AND rownum <= p_max;
END;
無論你是否認爲這是一個好主意,是超出了我的位置的範圍。問題是,無論何時存儲過程發生更改,結果都不匹配。短期的解決方法是查看兩個存儲過程,確定哪個存儲過程適合哪個選擇標準,然後編輯其他存儲過程以使它們都匹配。
作爲一個長期修復,我想改變get_records_count過程來調用get_records過程,然後返回從結果sys_refcursor返回的記錄總數。
EX:
PROCEDURE get_records_count(
p_first_name IN record_table.first_name%TYPE,
p_last_name IN record_table.last_name%TYPE,
p_resultCursor OUT sys_refcursor
)
AS
v_recordsSelectedCursor sys_refcursor;
BEGIN
/*I understand that I will need to change some logic in get_records to
handle the case in which p_max is set to zero.
It should take this case to not apply an upper limit.*/
get_records(p_first_name,p_last_name,0,0,v_recordsSelectedCursor);
/*This is where I really have NO idea what I'm doing.
Hopefully, you can infer what I'm trying to do. */
OPEN p_resultCursor FOR
SELECT count(*) FROM v_recordsSelectedCursor;
END;
實際問題
如何選擇,將一個SYS_REFCURSOR返回的記錄數?產生的數字需要在sys_refcursor內返回
這會有所幫助。你知道是否有可能將num輸出的值放入sysref遊標中,就像我用SELECT檢索過的一樣? –
上面的代碼是這樣做的。這是計數到refcursor – XING
噢,沒有注意到這一點。萬分感謝! –