2014-07-16 62 views
0

无数据请找到存储过程下面我写了:发现错误Oracle存储过程

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

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

+1

你不会从光标本身得到一个ORA-01403。如果它没有找到任何行,它不会出错,所以错误来自循环内的'select'。 –

回答

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; 

循环将在获取用完从游标结果的退出。

不知道为什么你有这么多的程序参数。看起来你只需要传入var3,并且没有任何东西可以传回。 v_Cur只能在declare节中声明为cursor,而不是作为参数。

1

在不知道你传递了什么数据以及表中包含什么数据的情况下,尝试将上下文置于过程的背后是非常困难的。

其他唯一的SQL,我怎么可能让NO_DATA_FOUND例外是:

"SELECT ID into variable3 from BACKUP where column3 = var1;" 

附上这与开始异常终止条款在你的程序,并尝试和调试:

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

正如我所建议的你提高,是这样,你不会松动线。它被添加到错误堆栈中。但无论如何,这是为了证明这一点,至于为什么错误正在发生...... –

+0

谢谢!我实际上正在分析打开游标的查询。这个查询实际上在某些情况下没有返回任何数据。 –