【问题标题】:How to declare a variable in postgres script?如何在 postgres 脚本中声明一个变量?
【发布时间】:2020-01-20 01:22:50
【问题描述】:

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

declare @age int = 10;

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

根据here 的 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

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

【问题讨论】:

  • SQL 没有变量。它们通常由 SQL 客户端提供 - 您使用哪个工具来运行脚本?
  • 我在使用 DataGrip。

标签: postgresql


【解决方案1】:

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

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

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

    • 您可以在 SQL 语句 DOCREATE FUNCTION/PROCEDURE 的主体中包含 PL/pgSQL 代码。

  2. PL/pgSQL中有变量,定义在DECLARE部分,但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;

【讨论】:

    【解决方案2】:

    好的结构是这样的:

    DO
     LANGUAGE plpgsql $$
    DECLARE
      variable int := 0;
    BEGIN
        -- your code
        raise notice '%', variable::varchar;
    END;
    $$;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-03
      • 2014-04-03
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多