2014-07-16 87 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

謝謝!我實際上正在分析打開遊標的查詢。這個查詢實際上在某些情況下沒有返回任何數據。 –