如何关闭oracle pl / sql中的SYS_REF CURSOR?

时间:2015-08-14 06:07:01

标签: plsql

我无法编译此pl/sql。我对pl/sql不熟悉,使用后我想close c_cur

create or replace
procedure GET_INSPECTION_CALL_REF_NO (
    in_vendor_code varchar2,
    c_cur out SYS_REFCURSOR
)
is
    declare
        c_cur is 
            select call_log_id, call_log_ref_no
            from INSPECTION_CALL_LOG
            where modified_by = in_vendor_code;

        var_c_cur c_cur%ROWTYPE;
    begin
        open c_cur;
        loop 
            fetch c_cur into var_c_cur
            exit when c_cur%notfound;
        end loop;
        close c_cur;
    end;
end GET_INSPECTION_CALL_REF_NO;

1 个答案:

答案 0 :(得分:0)

您可以重写您的程序,

create or replace
procedure GET_INSPECTION_CALL_REF_NO (
    in_vendor_code varchar2,
    c_cur out SYS_REFCURSOR
)
as 
    v_call_log_id  INSPECTION_CALL_LOG.call_log_id%type; 
    v_call_log_ref_no  INSPECTION_CALL_LOG.call_log_ref_no%type;
begin
    open c_cur for 
    select call_log_id, call_log_ref_no
    from INSPECTION_CALL_LOG
    where modified_by = in_vendor_code;

    loop 
        fetch c_cur into v_call_log_id, v_call_log_ref_no;
        exit when c_cur%notfound;
    end loop;

    close c_cur; --really needed here???
end GET_INSPECTION_CALL_REF_NO;
  

REF CURSOR是PL / SQL数据类型,其值是内存地址   数据库上的查询工作区。从本质上讲,REF CURSOR是一个   指针或数据库结果集的句柄

在这里,您使用ref-cursor返回结果,因此closing the cursor中没有任何意义。

这个proc的调用者有责任关闭光标。

您无法var_c_cur c_cur%ROWTYPE; ref-cursor 您必须使用table.column%typeDBMS_SQL包。

此程序可以改写为,

create or replace
procedure GET_INSPECTION_CALL_REF_NO (
    in_vendor_code varchar2,
    c_cur out SYS_REFCURSOR
)
as
begin
    open c_cur for 
    select call_log_id, call_log_ref_no
    from INSPECTION_CALL_LOG
    where modified_by = in_vendor_code;
end GET_INSPECTION_CALL_REF_NO;

关闭Ref-Cursor;

DECLARE
    v_cur  SYS_REFCURSOR;
    v_call_log_id  INSPECTION_CALL_LOG.call_log_id%type; 
    v_call_log_ref_no  INSPECTION_CALL_LOG.call_log_ref_no%type;
BEGIN
    GET_INSPECTION_CALL_REF_NO('some_code', v_cur);

    loop 
        fetch c_cur into v_call_log_id, v_call_log_ref_no;
        exit when c_cur%notfound;
        -- Use v_call_log_id, and v_call_log_ref_no...
    end loop;
  CLOSE v_cur; --Please note.
END;
/