我无法编译此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;
答案 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%type
或DBMS_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;
/