如何在Postgres脚本中声明变量?

时间:2019-09-19 04:26:39

标签: postgresql

我对Postgres还是陌生的,我不敢相信仅仅声明一个变量有多困难。我确实遇到过其他SO职位,但是在我的情况下他们都没有帮助。我只想在postgres中编写一个如下所示的脚本:

declare @age int = 10;

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

基于SO帖子here,我尝试了:

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

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:0)

好的结构是这样的:

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