在oracle存储过程中找不到数据错误

时间:2014-07-16 20:26:12

标签: oracle stored-procedures

请在下面找到我写的存储过程:

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条记录。 但是当我运行这个存储过程时,它会显示“找不到数据”。

它也没有编译错误。 我在这里错过了什么吗?

2 个答案:

答案 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中的任何行column1column2为空,则您将获取太多次,并且当您用完数据时的提取将返回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,而不是声明。