164

如何将查询结果分配给 PL/pgSQL(PostgreSQL 的过程语言)中的变量?

我有一个功能:

CREATE OR REPLACE FUNCTION test(x numeric)
RETURNS character varying AS
$BODY$
DECLARE
name   character varying(255);
begin
 name ='SELECT name FROM test_table where id='||x;

 if(name='test')then
  --do somthing
 else
  --do the else part
 end if;
end;
return -- return my process result here
$BODY$
LANGUAGE plpgsql VOLATILE

在上面的函数中,我需要存储这个查询的结果:

'SELECT name FROM test_table where id='||x;

到变量name

如何处理这个?

4

6 回答 6

244

我想你正在寻找SELECT select_expressions INTO

select test_table.name into name from test_table where id = x;

name将从test_table哪里提取id函数的参数并将其保留在name变量中。不要遗漏表名前缀,test_table.name否则您会抱怨引用不明确。

于 2012-09-08T05:29:10.637 回答
104

要分配单个变量,您还可以在 PL/pgSQL 代码块中使用普通分配,右侧带有标量子查询

name := (SELECT t.name from test_table t where t.id = x);

实际上与@mu 已经提供SELECT INTO的类似,但有细微的差别:

  • SELECT INTO在我对 Postgres 14 的测试中,速度稍快一些。
    (在不涉及 的情况下,常量的简单分配SELECT仍然快 10 倍。)
  • SELECT INTO还设置了特殊变量FOUND,而普通赋值则没有。你可能想要一个或另一个。
  • SELECT INTO也可以一次分配多个变量。看:

值得注意的是,这也有效:

name := t.name from test_table t where t.id = x;

没有前导的SELECT语句SELECT。但我不会使用这种混合动力车。正如@Pavel 评论的那样,最好使用前两个更清晰、记录在案的方法中的一个。

于 2012-09-08T07:14:47.780 回答
20

通常的模式是EXISTS(subselect)

BEGIN
  IF EXISTS(SELECT name
              FROM test_table t
             WHERE t.id = x
               AND t.name = 'test')
  THEN
     ---
  ELSE
     ---
  END IF;

此模式用于 PL/SQL、PL/pgSQL、SQL/PSM、...

于 2012-09-08T18:52:54.090 回答
2

创建学习表:

CREATE TABLE "public"."learning" (
    "api_id" int4 DEFAULT nextval('share_api_api_id_seq'::regclass) NOT NULL,
    "title" varchar(255) COLLATE "default"
);

插入数据学习表:

INSERT INTO "public"."learning" VALUES ('1', 'Google AI-01');
INSERT INTO "public"."learning" VALUES ('2', 'Google AI-02');
INSERT INTO "public"."learning" VALUES ('3', 'Google AI-01');

步骤:01

CREATE OR REPLACE FUNCTION get_all (pattern VARCHAR) RETURNS TABLE (
        learn_id INT,
        learn_title VARCHAR
) AS $$
BEGIN
    RETURN QUERY SELECT
        api_id,
        title
    FROM
        learning
    WHERE
        title = pattern ;
END ; $$ LANGUAGE 'plpgsql';

步骤:02

SELECT * FROM get_all('Google AI-01');

步骤:03

DROP FUNCTION get_all();

演示: 在此处输入图像描述

于 2017-05-08T09:35:16.350 回答
0

使用单行结果执行查询时,请使用以下语法:

SELECT select_expressions INTO [STRICT] target FROM ...

其中target可以是记录变量、行变量或简单变量和记录/行字段的逗号分隔列表。

与, 不同SELECT INTOSELECT select_expressions INTO不会创建表。

在您的示例中,您有一个简单的变量name,因此 select 语句将是:

SELECT test_table.name INTO name FROM test_table WHERE test_table.id = x;
于 2021-04-15T11:54:40.917 回答
-1

您可以使用以下示例使用 PL/pgSQL 将查询结果存储在变量中:

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
于 2018-10-08T12:35:34.977 回答