我正在迁移一个Oracle PLSQLSP以兼容Postgres plpgsql(x86_64-PC-LINUX-GNU上的PostgreSQL13.6版本,由x86_64-PC-LINUX-GNU-GCC(GCC)7.4.0编译,64位).

PLSQL SP的异常块代码如下:

exception
    when others then
        if CURR1%isopen then
            close SPV_RECON_INFO;
        end if;
        open CURR1 for execute select sysdate from dual;
END;

如何在postgres中实现%isopen?

推荐答案

这很简单.您必须为游标变量指定一个名称,然后才能在pg_cursors中搜索该游标.如果存在包含name的行,则游标处于打开状态.

以下是一个完整的示例:

DO
$$DECLARE
   c refcursor;
BEGIN
   c := 'mycursor';
   /* cursor is not open, EXIST returns FALSE */
   RAISE NOTICE '%', EXISTS (SELECT 1 FROM pg_cursors WHERE name = 'mycursor');
   OPEN c FOR SELECT * FROM pg_class;
   /* cursor is open, EXIST returns TRUE */
   RAISE NOTICE '%', EXISTS (SELECT 1 FROM pg_cursors WHERE name = 'mycursor');
END;$$;

NOTICE:  f
NOTICE:  t

如果您不分配名称,PostgreSQL将生成一个名称(但您不知道名称是什么).

Postgresql相关问答推荐

正在应用序列化迁移,但数据库没有更改

数组格式类型的PostgreSQL日期

supabase 中的交易

在 Postgresql 中实现自定义运算符时出错

Postgres 函数 now() 返回不正确的时区偏移量

是否可以调整 PostgreSQL 中的数组以适应 IN 运算符?

我在try 访问我的数据库表时在 postgresql 中收到 aclcheck_error 错误

包含间隔在 jooq 和 postgres 中没有按预期工作

Postgres 转储按顺序插入

连接 Supbase Postgresql 数据库时,Stepzen Graphiql 资源管理器中的主机名解析错误

如何获得区间的绝对值

PostgreSQL 查询到 Excel 表

将 PostgreSQL 配置为仅适用于 LOCALHOST 或指定的 ip + 端口

为什么PostgresQL查询性能随时间下降,但在重建索引时恢复

在 postgreSQL 中更改序列名称

为 Django Postgres 连接强制 SSL

如何在数据库表中查找重复条目?

使用 RPostgreSQL 写入特定模式

如何使 array_agg() 像 mySQL 中的 group_concat() 一样工作

PostgreSQL - pg_config -bash:pg_config:command not found