如何在PostgreSQL中测试if语句?

7

问题:我想在PostgreSQL中测试if语句:

IF (SELECT COUNT(*) FROM pg_language WHERE lanname = 'plpgsql') > 0 THEN
    PRINT 'Good'
ELSE
    PRINT 'Bad'
END IF;

现在这个语句在IF处报错。据我所读,这是因为我需要使用plpgsql才能使用if、print和变量等。到目前为止,我可能也需要使用SELECT而不是print。我该如何在执行该语句之前将语言切换为plpgsql?我想先测试它,然后再将其放入存储过程中。以便测试带有变量等的代码。
DO LANGUAGE plpgsql $$
    BEGIN
        IF (SELECT COUNT(*) FROM pg_language WHERE lanname = 'plpgsql') > 0 THEN 
            RAISE NOTICE 'GOOD';
        ELSE
            RAISE NOTICE 'BAD';
        END IF;
    END;
$$;

回复:“我想先测试一下,再将其放入存储过程中。”为什么?当你测试 C# 代码时,难道会拒绝创建一个 Main 方法吗? - ruakh
@ruakh:不,但我拒绝为每一行代码(带有所有参数)编写一个函数,然后每次需要测试一些代码时都必须从主方法中调用此函数(然后还要删除这些函数)。基本上,我想做的就是在脚本开始时运行CREATE LANGUAGE plpgsql;,如果它不是注册语言。但是如果没有if语句,这似乎几乎不可能... - Stefan Steiger
Postgres中没有PRINT语句。而且PL/pgSQL自9.0版本以来始终存在。因此,如果你的目标是早期版本,你只需要测试它。 - user330315
@a_horse_with_no_name: 据我所知,它只被称为RAISE NOTICE。那么仍然有一个问题,为什么print会被突出显示。具有讽刺意味的是,它在生产服务器上运行良好,但在开发服务器上失败了,因为生产服务器是全新的,而开发服务器是旧的。一般来说,你永远不知道潜在客户会使用/接受哪个版本。 - Stefan Steiger
1个回答

11

如果你只是想快速测试代码,而不想费力地构建和删除函数,那么你可以使用DO

=> do language plpgsql $$
    begin
        -- Yes, I have a table called pancakes in my playpen database.
        if (select count(*) from pancakes) > 0 then
            raise notice 'Got some';
        else
            raise notice 'Got none';
        end if;
    end;
$$;

你需要使用9.0+版本来使用DO


只是用于开发,所以9.0+就可以了。 - Stefan Steiger
但如果您有9.0,则无需检查plpgsql(因为它已默认安装)。对于早于9.0版本的情况,您没有DO语句。 - user330315
@a_horse_with_no_name:我认为你关注的是错误的事情,查询本身是一个干扰因素,真正的问题隐藏在结尾处:“使用变量等测试代码”。OP似乎更感兴趣的是psql的REPL。 - mu is too short
@a_horse_with_no_name:错了,你只需要不检查部署是否将在你的机器上进行(如果你知道它是9.0+),但如果你还要在其他版本可能小于9.0的机器上部署,就需要检查了...而且DO语句真正只用于开发(在9.0上),所以对于小于9.0的部署来说并不重要。 - Stefan Steiger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接