バックグラウンド
PLSQL ストアド プロシージャを呼び出して情報を取得および操作する Web アプリケーションに取り組んでいます。そのような場合の 1 つは、データベースに 2 つのストアド プロシージャがあります。1 つは指定された一連のパラメーターのレコードの総数を選択するもので、もう 1 つは同じパラメーターとページネーション パラメーター (最小および最大 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 から返されるレコードの総数を返したいと考えています。
元:
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 内で返す必要があります