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


130

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

如何处理呢?

Answers:


198

我认为您正在寻找SELECT INTO

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

这将拉动nametest_table哪里id是你的函数的参数,让它在name变。不要遗漏表名前缀,test_table.name否则您会抱怨引用不明确。


2
如果我需要多个变量怎么办。就像选择test_table.name,test_table.id,test_table.ssn一样?
道林2015年

2
@DaoLam:从我喜欢的文档中可以看出:“可以将产生单行(可能是多列)的SQL命令的结果分配给记录变量,行类型变量或标量变量列表。”
亩太短

@muistooshort,所以你说我可以做同样的事情,并且我可以使用name.id,name.ssn来检索?我用IF EXISTS尝试了一下,但是没有用:IF EXISTS(从test_table中选择*进入名称...)
道林

@DaoLam为什么将INTO与IF EXISTS结合?也许您应该问一个新的问题,以便您可以解释自己要做什么。
亩太短了

3
文档中没有示例(或者我错过了),但是正如@muistooshort指出的那样,您可以通过一次选择选择多个变量:SELECT test_table.column1, test_table.column2 INTO variable1, variable2 FROM test_table WHERE id = x;
Grengas

78

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

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

或使用SELECT INTO@mu已经提供

这也起作用:

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

但是最好使用前两种更清晰的方法之一,如@Pavel所评论。

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


1
这不是一个好主意-此功能未记录且很丑陋
Pavel Stehule 2012年

2
PL / pgSQL允许将SQL和PL混合使用-有时您可以创建真正奇怪的生物,但最好在独立的语句中混合PL和SQL。
Pavel Stehule 2012年

@PavelStehule:我同意,您的表格是可取的。
Erwin Brandstetter,2012年

其实我也prefere你的语法,但问题是,当你玩啊处理错误,你的发言犯规发送发现在选择的相对真实into语句,结账(postgresql.org/docs/9.1/plpgsql-statements.html
SENHAJI RHAZI Hamza

18

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


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

演示: 在此处输入图片说明


-2

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

 select * into demo from maintenanceactivitytrack ; 
    raise notice'p_maintenanceid:%',demo;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.