0

関数から返されたときに、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

誰かが私がここで間違っていることを理解するのを手伝ってくれますか?

4

2 に答える 2

0

この問題を解決する方法は、戻り値の型を ref_cursor から sys_refcursor に変更することでした。それを修正するのはばかげた方法のように思えますが、その変更でうまくいきました。コード:

function GetBound(p_lat in number, p_long in number) return sys_refcursor
IS
v_rc_ref_cursor sys_refcursor;
BEGIN

open v_rc_ref_cursor for select * from state_bound;
return v_rc_ref_cursor;

END;
于 2014-08-25T05:34:59.040 に答える