Postgres 14使用dblink_get_connections判断连接存在返回NULL问题
问题根因
PostgreSQL 遵循 SQL 标准的三值逻辑,所有值与 NULL 进行比较运算(包括 =、!=、<>、IN/NOT IN)时,返回结果都是 NULL,既不是 true 也不是 false。而 PL/pgSQL 的 IF 分支只有在条件表达式计算结果为严格的 true 时才会进入。
当没有任何已建立的 dblink 连接时,dblink_get_connections() 会返回 NULL,此时你的 connectionIsGood 变量值就是 NULL,不管是 connectionIsGood != true 还是后续你加的赋值判断,条件计算结果都是 NULL,自然永远进不到抛出异常的分支。你尝试的 NOT IN 写法不生效也是同一个原因:当右侧匹配列表为 NULL 时,NOT IN 的返回结果同样是 NULL,无法触发条件。
正确实现方案
方案1:用COALESCE兜底NULL值
直接在变量赋值阶段把 NULL 结果转换为 false,后续判断就可以正常走布尔逻辑:
DO $$ DECLARE connectionIsGood boolean := COALESCE( (SELECT 'my_connection' = ANY (dblink_get_connections())), false ); BEGIN RAISE INFO 'connectionIsGood=%', connectionIsGood; IF NOT connectionIsGood THEN RAISE EXCEPTION 'no connection exists'; END IF; -- 此处执行业务核心逻辑 END $$;
方案2:判断时直接覆盖NULL场景
不需要单独声明变量,直接在条件分支里先判断是否存在已打开连接,再校验目标连接是否存在,逻辑更直观:
DO $$ BEGIN IF dblink_get_connections() IS NULL OR NOT 'my_connection' = ANY (dblink_get_connections()) THEN RAISE EXCEPTION 'no connection exists'; END IF; -- 此处执行业务核心逻辑 END $$;
内容的提问来源于stack exchange,提问作者Stephen Baldwin
相关产品推荐
相关产品推荐

