我如何测试 refcursor 是否已经在 plpgsql 中打开

how do I test if a refcursor is already open in plpgsql

我正在尝试迁移 Postgres 中的 Oracle Procedure / Funcnctions,我发现在处理 PostgreSQL 中的游标语法时遇到了一些困难。 Oracle 过程片段是:

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 中迁移它。

提前致谢!

使用未绑定游标变量。

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;