在 PL/pgSQL 中使用变量存储查询结果

如何将查询结果分配给 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

如何处理这个?

326556 次浏览

我想你要找的是 SELECT select_expressions INTO:

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

这将从 test_table中提取 name,其中 id是函数的参数,并将其保留在 name变量中。不要在 test_table.name上省略表名前缀,否则你会收到关于引用不明确的投诉。

为了分配一个 单一变量,您还可以在 PL/pgSQL 代码块中使用 < strong > 普通任务 ,右边是 标量子查询标量子查询:

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

@ mu 已提供一样,SELECT INTO实际上也是一样的,只是有一些细微的差别:

  • 在我的 Postgres 14测试中,SELECT INTO稍微快一些。
    (不涉及 SELECT的常数的简单赋值仍然要快10倍。)
  • SELECT INTO也设置 特殊变量 FOUND,而纯赋值不设置。您可能需要其中一个。
  • SELECT INTO也可以立即分配 多重变量。参见:

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

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

没有前导 SELECTSELECT语句。但我会使用 没有混合动力。正如@Pavel 所说,最好使用前两种方法中的一种,这种方法更清晰,有文档记录。

通常的模式是 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、 ..。

创建学习桌:

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();

演示: enter image description here

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

 select * into demo from maintenanceactivitytrack ;
raise notice'p_maintenanceid:%',demo;

根据 执行具有单行结果的查询,使用以下语法:

SELECT select_expressions INTO [STRICT] target FROM ...

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

SELECT INTO不同,SELECT select_expressions INTO不创建表。

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

SELECT test_table.name INTO name FROM test_table WHERE test_table.id = x;