関数から返されたときに、PL/SQL で開いている ref_cursor からのフェッチに問題があります。return ステートメントの代わりに関数の本体にまったく同じ fetch ステートメントを入れると、正常に動作します。
function GetBound(p_lat in number, p_long in number) return ref_cursor
IS
v_rc_ref_cursor sys_refcursor;
BEGIN
open v_rc_ref_cursor for select * from state_bound;
return v_rc_ref_cursor;
END;
匿名の plsql ブロックから呼び出すと、「ORA-01001: カーソルが無効です」というエラーが表示されます。
DECLARE
v_rc_ref_cursor sys_refcursor;
v1 number(38);
v2 varchar2(50);
v3 number(38);
v4 varchar2(50);
BEGIN
v_rc_ref_cursor := GetBound(122.0928,-18.6974);
fetch v_rc_ref_cursor into v1, v2, v3, v4;
close v_rc_ref_cursor;
DBMS_OUTPUT.PUT_LINE(v1 || v2 || v3 || v4);
END;
ただし、匿名ブロックを実際の関数に入れると、すべて機能します。下記参照:
function GetBound(p_lat in number, p_long in number) return ref_cursor
IS
v_rc_ref_cursor sys_refcursor;
v1 number(38);
v2 varchar2(50);
v3 number(38);
v4 varchar2(50);
BEGIN
open v_rc_ref_cursor for select * from state_bound;
-- return v_rc_ref_cursor;
fetch v_rc_ref_cursor into v1, v2, v3, v4;
close v_rc_ref_cursor;
DBMS_OUTPUT.PUT_LINE(v1 || v2 || v3 || v4);
END;
私は周りを読んで、私がここでやっていることをしている人々の例をいくつか見つけたので、私の知る限り、これはうまくいくはずです。例えば。https://community.oracle.com/thread/888365
誰かが私がここで間違っていることを理解するのを手伝ってくれますか?