首页 > 解决方案 > 如何在 postgres 脚本中声明变量?

问题描述

我对 Postgres 还很陌生,我无法相信我发现仅仅声明一个变量有多么困难。我确实遇到过其他 SO 帖子,但没有一个对我的情况有帮助。我想要的只是在 postgres 中编写如下脚本:

declare @age int = 10;

select * from person p where p.age > @age;

根据此处的 SO 帖子,我尝试了:

DO
$$
    DECLARE
        overTheAgeOf int := 15;
    BEGIN
        select *
        from person
        where age > overTheAgeOf;
    END
$$;

这给了我错误:[42601] ERROR: query has no destination for result data

然后我尝试返回脚本的结果:

return (select *
    from person
    where age > overTheAgeOf);

这给了我另一个错误:ERROR: RETURN cannot have a parameter in function returning void

如何声明一个变量并在后面的脚本中使用它?

标签: postgresql

解决方案


你在几个层面上感到困惑。

  1. 有查询语言 SQL,也有过程语言 PL/pgSQL。唯一的联系是

    • 您可以从 PL/pgSQL 代码运行 SQL 语句

    • 您可以在 SQL 语句的主体中包含 PL/pgSQL 代码,DO并且CREATE FUNCTION/PROCEDURE.

  2. PL/pgSQL中有变量,在DECLAREsection中定义,但是SQL中没有变量。

  3. DO语句不能返回任何值。

如果要使用 PL/pgSQL 变量,并且要返回值,则必须使用函数。一个例子:

CREATE FUNCTION getpersons() RETURNS SETOF person
   LANGUAGE plpgsql AS
$$DECLARE
   overTheAgeOf int := 15;
BEGIN
    RETURN QUERY
       SELECT *
       FROM person
       WHERE age > overTheAgeOf;
END;$$;

SELECT getpersons();

可以在客户端使用变量。对于psql客户端,您可以使用:

\set overTheAgeOf 15

SELECT *
FROM person
WHERE age > :overTheAgeOf;

推荐阅读