请在下面找到我写的存储过程:
create or replace
procedure CursorProc_test_vp
(
v_Cur IN OUT types.ref_cursor,
count_var IN OUT number,
var1 IN OUT varchar2,
var2 IN OUT number,
var3 IN OUT number
)
as
begin
select count(*) into count_var from vendor_backup;
open v_Cur for 'select column1,column2 from BACKUP where column1 is not null and column2 is null';
while count_var>0
loop
fetch v_Cur into var1,var2;
SELECT ID into variable3 from BACKUP where column3 = var1;
UPDATE BACKUP SET column2 = var3;
count_var:=count_var-1;
end loop;
close v_cur;
end;
当我运行用于打开光标的查询时,我得到120条记录。 但是当我运行这个存储过程时,它会显示“找不到数据”。
它也没有编译错误。 我在这里错过了什么吗?
答案 0 :(得分:2)
在不知道您传递的数据以及表中包含的数据的情况下,尝试将上下文放在过程后面是非常困难的。
我将导致NO_DATA_FOUND异常的唯一其他SQL是:
"SELECT ID into variable3 from BACKUP where column3 = var1;"
在程序中附加一个Begin Exception End Clause并尝试Debug:
Begin
SELECT ID into variable3 from BACKUP where column3 = var1;
Exception
When NO_DATA_FOUND Then
DBMS_OUTPUT.PUT_LINE('ERROR: '||sqlerrm);
Raise; -- To ensure if this is the error, you will set get no_data_found raised...
End;
答案 1 :(得分:0)
您的count_var
可能太高,即超过120,因为它没有与光标相同的过滤器。如果backup
中的任何行column1
或column2
为空,则您将获取太多次,并且当您用完数据时的提取将返回null;然后你的内部select
会尝试匹配null,这将得到一个ORA-01403。
backup
column3 = var1
中也可能没有匹配的记录。目前还不清楚您是否拥有一致的数据。
但假设该部分有效,您可以在没有单独的count_var
:
open v_Cur for select column1, column2 from backup where ... ;
loop
fetch v_Cur into var1,var2;
exit when v_Cur%NOTFOUND;
SELECT ID into variable3 from BACKUP where column3 = var1;
UPDATE BACKUP SET column2 = var3;
end loop;
close v_cur;
当fetch用完光标的结果时,循环将退出。
不确定为什么你有这么多的程序参数。看起来你只需要传入var3
,没有什么可以传回来的。 v_Cur
可以在声明部分声明为cursor
,而不是声明。