62

如何使用PostgreSQL存储在变量中的查询结果存储过程商店使用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 eles part 
end if; 
end; 
return -- return my process result here 
$BODY$ 
LANGUAGE plpgsql VOLATILE 

查询结果变量

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

该查询返回结果的变量名

如何处理?请让我知道

回答

91

我认为你正在寻找SELECT INTO

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

这将拉动nametest_table其中id是你的函数的参数,并把它留在name变量。不要忽略test_table.name上的表名前缀,否则您会收到关于模糊引用的投诉。

+3

感谢威武!!!!!!!!! – Sathish

+1

如果我需要多个变量,该怎么办?像选择test_table.name,test_table.id,test_table.ssn? –

+1

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

36

只要你分配一个变量,你也可以使用普通的赋值,PLPGSQL功能:

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

或者使用SELECT INTO@mu already provided

这工作,也:

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

但最好使用前两个中的一个,更清晰的方法,如@Pavel评论。

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

+0

这不是个好主意 - 这个功能没有文档记录,也很丑陋 –

+2

PL/pgSQL允许混合使用SQL和PL - 有时您可以创建非常奇怪的生物,但更好地将PL和SQL混合使用 - 在单独的语句中。 –

+0

@PavelStehule:我同意,你的表格是可取的。 –

14

通常的图案是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,...

1

创建学习表:

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