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

Sat*_*ish 108 database postgresql stored-procedures plpgsql postgresql-9.1

如何将查询结果分配给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
Run Code Online (Sandbox Code Playgroud)

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

'SELECT name FROM test_table where id='||x;
Run Code Online (Sandbox Code Playgroud)

到变量name.

怎么处理这个?

mu *_*ort 162

我想你正在寻找SELECT INTO:

select test_table.name into name from test_table where id = x;
Run Code Online (Sandbox Code Playgroud)

这将拉动nametest_table哪里id是你的函数的参数,让它在name变.不要忽略表名前缀test_table.name或者你会得到关于模糊引用的投诉.

  • Postgres 文档将此语法称为“SELECT select_expressions INTO”(不创建表),而不是“SELECT INTO”(创建表)。[更多信息](/sf/answers/4697558561/) (3认同)
  • 如果我需要多个变量怎么办。像选择test_table.name,test_table.id,test_table.ssn一样? (2认同)
  • @DaoLam:从我喜欢的文档中可以看出:“生成单行(可能是多列)的 SQL 命令的结果可以分配给记录变量、行类型变量或标量变量列表。” (2认同)
  • 文档中没有示例(或者我错过了),但是正如@muistooshort指出的那样,您可以通过一次选择就可以选择多个变量: (2认同)

Erw*_*ter 67

只要您分配单个变量,您还可以在plpgsql函数中使用普通赋值:

name := (SELECT t.name from test_table t where t.id = x);
Run Code Online (Sandbox Code Playgroud)

或者SELECT INTO@mu已经提供的那样使用.

这也有效:

name := t.name from test_table t where t.id = x;
Run Code Online (Sandbox Code Playgroud)

但更好地使用前两个更清晰的方法之一,正如@Pavel所评论的那样.

我另外用表别名缩短了语法.
更新:我删除了我的代码示例,并建议使用IF EXISTS(),而不是像由@Pavel提供.

  • PL/pgSQL允许混合使用SQL和PL - 有时候你可以创建非常奇怪的生物,但最好将PL和SQL干净地混合在一起 - 在孤立的语句中. (2认同)

Pav*_*ule 16

通常的模式是EXISTS(subselect):

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

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