2017-07-27 35 views
-2

我正在嘗試在Postgres中遷移Oracle Procedure/Funcnctions,在PostgreSQL中我發現處理PostgreSQL中的遊標語法有一些困難。 甲骨文PROC片段是:我如何測試一個refcursor是否已經在plpgsql中打開

IF v_user_auth THEN 
       OPEN no_emp_cur; 
      ELSE 
       OPEN un_auth_no_emp_cur; 
      END IF; 
      ELSE 
      IF v_direction = 'newer' THEN 
       IF v_user_auth THEN 
       OPEN newer_cur; 
       ELSE 
       OPEN un_auth_new_cur; 
       END IF; 
      ELSE -- older 
       IF v_user_auth THEN 
       OPEN older_cur; 
       ELSE 
       OPEN un_auth_old_cur; 
       END IF; 
      END IF; 
      END IF; 

      LOOP 
      IF no_emp_cur%ISOPEN THEN 
       FETCH no_emp_cur INTO v_emp_rec; 
       IF NOT FOUND THEN EXIT; END IF; -- apply on no_emp_cur 
      ELSIF un_auth_no_emp_cur%ISOPEN THEN 
       FETCH un_auth_no_emp_cur INTO v_emp_rec; 
       IF NOT FOUND THEN EXIT; END IF; -- apply on un_auth_no_emp_cur 
      ELSIF newer_cur%ISOPEN THEN 
       FETCH newer_cur INTO v_emp_rec; 
       IF NOT FOUND THEN EXIT; END IF; -- apply on newer_cur 
      ELSIF older_cur%ISOPEN THEN 
       FETCH older_cur INTO v_emp_rec; 
       IF NOT FOUND THEN EXIT; END IF; -- apply on older_cur 
      ELSIF un_auth_new_cur%ISOPEN THEN 
       FETCH un_auth_new_cur INTO v_emp_rec; 
       IF NOT FOUND THEN EXIT; END IF; -- apply on un_auth_new_cur 
      ELSIF un_auth_old_cur%ISOPEN THEN 
       FETCH un_auth_old_cur INTO v_emp_rec; 
       IF NOT FOUND THEN EXIT; END IF; -- apply on un_auth_old_cur 
      END IF; 

      Few Processing ... 

      END LOOP; 
      IF no_emp_cur%ISOPEN THEN 
      CLOSE no_emp_cur; 
      ELSIF un_auth_no_emp_cur%ISOPEN THEN 
      CLOSE un_auth_no_emp_cur; 
      ELSIF newer_cur%ISOPEN THEN 
      CLOSE newer_cur; 
      ELSIF older_cur%ISOPEN THEN 
      CLOSE older_cur; 
      ELSIF un_auth_new_cur%ISOPEN THEN 
      CLOSE un_auth_new_cur; 
      ELSIF un_auth_old_cur%ISOPEN THEN 
      CLOSE un_auth_old_cur; 
      END IF; 
    END IF; 

請與語法中的Postgres遷移此幫助。

在此先感謝!

+0

你有寫過任何代碼到目前爲止? –

+0

我剛剛關閉了所有遊標,但我不確定如何使用這種方式,所以我只想在遊標打開的情況下知道語法,我們可以關閉該遊標。 – Pooja

+0

請修改您的問題,具體說明您的問題以及您嘗試過的方法。聽起來真正的問題是「如何測試refcursor是否已經在plpgsql中打開」? –

回答

1

使用未綁定的遊標變量。

DECLARE 
    c refcursor; 
BEGIN 
    IF ... THEN 
     OPEN c FOR SELECT ...; 
    ELSE 
     OPEN c FOR SELECT ...; 
    END IF; 

    LOOP 
     FETCH c INTO v_emp_rec; 
     ... 
    END LOOP; 

    CLOSE c; 
END; 
相關問題