如何测试引用光标是否已在 plpgsql 中打开



我正在尝试在PostgreSQL中迁移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;

最新更新