2011-02-02 105 views
2

下面是一些實際的代碼我試圖調試:如果設置爲空,FETCH INTO不會引發異常,是嗎?

BEGIN 
      OPEN bservice (coservice.prod_id); 

      FETCH bservice 
      INTO v_billing_alias_id, v_billing_service_uom_id, v_summary_remarks; 

      CLOSE bservice; 

      v_service_found := 1; 
     -- An empty fetch is expected for some services. 
     EXCEPTION 
      WHEN OTHERS THEN 
       v_service_found := 0; 
     END; 

當參數化光標bservice(PROD_ID)是空的,它取空到三個變量,並且不拋出異常。

因此,編寫此代碼期望它拋出異常的人是錯誤的,對吧?評論似乎意味着和預計空取回,然後它爲稍後處理設置一個標誌,但我認爲這個代碼不可能已經用空集測試過。

顯然,它應該使用bservice%NOTFOUND或bservice%FOUND或類似的。

回答

4

當參數化遊標bservice(prod_id)爲空時,它將NULL提取到三個變量中,並且不會引發異常。

錯誤

當T ,它取什麼,不覆蓋任何價值。

declare 

    cursor c(dt in date) is 
    select dummy from dual 
    where dt > sysdate; 

    dummy_ dual.dummy%type; 

begin 

    open c(sysdate + 2); 
    fetch c into dummy_; 
    close c; 
    dbms_output.put_line('1: ' || dummy_); 

    open c(sysdate - 2); 
    fetch c into dummy_; 
    close c; 
    dbms_output.put_line('2: ' || dummy_); 

end; 
/

打印

1: X 
2: X 

所以誰寫這段代碼期待它拋出一個異常是錯誤的,對不對?

顯然,它應該使用bservice%NOTFOUND或bservice%FOUND或類似的。 是的

+0

Nyffenegger對,它基本上就像SQL Server一樣工作。我認爲FETCH不覆蓋變量就是爲什麼沒有檢測到這個錯誤。不知道爲什麼光標首先被使用,因爲你可以選擇變量,或者直接進入更新... – 2011-02-03 15:12:16

4

如果你想知道,如果遊標返回任何結果,使用%FOUND光標屬性:

 OPEN bservice (coservice.prod_id); 

     FETCH bservice 
     INTO v_billing_alias_id, v_billing_service_uom_id, v_summary_remarks; 

     -- An empty fetch is expected for some services. 
     IF (bservice%FOUND) THEN 
      v_service_found := 1; 
     ELSE 
      v_service_found := 0; 
     END IF 

     CLOSE bservice; 

cursor attributes

%FOUND
  • 返回INVALID_CURSOR如果遊標聲明,但沒開;或者光標已關閉。
  • ,則返回null光標是開放的,但如果取指一個成功提取已被執行
  • 返回FALSE,如果沒有返回行尚未執行
  • 返回TRUE。
相關問題