Postgresql存储函数只返回不带列名的值

时间:2014-04-22 05:09:38

标签: postgresql stored-procedures postgresql-9.1 stored-functions

我是Postgresql的新手。我刚刚用复合类型创建了函数。

以下是我的代码:

create type search_type as (
result_id bigint, 
result_name character varying,
result_loc character varying,
result_type character varying,
result_pic character varying
);

    CREATE OR REPLACE FUNCTION search_result("@search_text" character varying)
  RETURNS SETOF search_type AS
$BODY$
DECLARE r search_type%rowtype;
BEGIN   
    FOR r IN SELECT "User_id" AS result_id, CONCAT("User_firstname", ' ', "User_lastname") AS result_name, "User_loc" AS result_loc, "User_picurl" AS result_pic, 'user' AS result_type FROM users_list WHERE CONCAT("User_firstname", ' ', "User_lastname") LIKE CONCAT("@search_text", '%') LOOP
        RETURN NEXT r;
    END LOOP;
    FOR r IN SELECT "Community_id" AS result_id, "Community_name" AS result_name, "Community_location" AS result_loc, "Community_img_url" AS result_pic, 'community' AS result_type FROM community_list WHERE "Community_name" LIKE CONCAT("@search_text", '%') AND "Type" = 'Created' LOOP
        RETURN NEXT r;
    END LOOP;
    RETURN;
END
$BODY$
  LANGUAGE plpgsql

但是,当我像下面的代码一样调用存储的函数时,它只会使用不具有列名的数据。

SELECT search_result('c');

原因是什么?

如何使用值返回列名? enter image description here

以上是recorsd返回。

但我需要得到结果:

result_id  result_name  result_loc      result_pic  result_type
---------  -----------  ----------      -----------  ----------
13         test1        San Francisco                user
14         test2        San Francisco                user
15         test3        San Francisco                user
16         test4        San Francisco                user
17         test5        San Francisco                user

如何获得上述结果?

更新

新代码:

CREATE OR REPLACE FUNCTION search_result("@search_text" character varying, "@row_start" integer, "@row_end" integer)
  RETURNS SETOF search_type AS
$BODY$
DECLARE r search_type%rowtype;
BEGIN   
    FOR r IN SELECT "User_id" AS result_id, CONCAT("User_firstname", ' ', "User_lastname") AS result_name, "User_loc" AS result_loc, "User_picurl" AS result_pic, 'user' AS result_type FROM users_list WHERE CONCAT("User_firstname", ' ', "User_lastname") LIKE CONCAT("@search_text", '%') ORDER BY CONCAT("User_firstname", ' ', "User_lastname") ASC LIMIT "@row_end" OFFSET "@row_start" LOOP
        RETURN NEXT r;
    END LOOP;
    FOR r IN SELECT "Community_id" AS result_id, "Community_name" AS result_name, "Community_location" AS result_loc, "Community_img_url" AS result_pic, 'community' AS result_type FROM community_list WHERE "Community_name" LIKE CONCAT("@search_text", '%') AND "Type" = 'Created' ORDER BY "Community_name" ASC LIMIT "@row_end" OFFSET "@row_start" LOOP
        RETURN NEXT r;
    END LOOP;
    RETURN;
END
$BODY$
  LANGUAGE plpgsql

然后我将程序称为:

SELECT * FROM search_result('t',3,0)

但没有返回任何值。

1 个答案:

答案 0 :(得分:2)

你需要:

SELECT * FROM search_result('c');

不仅仅是:

SELECT search_result('c');

如果你想要一个表结果。在SELECT中调用的集返回函数返回复合元组。