2017-07-27 2 views
-2

J'essaye de migrer Oracle Procedure/Funcnctions dans Postgres dans lequel je trouve quelques difficultés avec la syntaxe du curseur dans PostgreSQL. extrait Oracle proc est:comment tester si un refcursor est déjà ouvert dans 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; 

S'il vous plaît aider avec la syntaxe de migrer ce dans Postgres.

Merci d'avance!

+0

Avez-vous déjà écrit un code? –

+0

Je viens de fermer tout le curseur à la fin, mais je ne suis pas sûr d'utiliser de cette façon, donc je voulais connaître la syntaxe dans le cas où le curseur est ouvert, alors nous pouvons fermer ce curseur particulier. – Pooja

+0

Veuillez modifier votre question pour être précis au sujet de votre problème et de ce que vous avez essayé. Il semble que la vraie question est "comment puis-je tester si un refcursor est déjà ouvert dans plpgsql"? –

Répondre

1

Utilisez une variable curseur non liée.

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;