PostgreSQL:调用自定义函数时出错

时间:2014-08-25 12:21:07

标签: function postgresql plpgsql

以下是在PostgreSQL 9.2

中创建的功能
CREATE OR REPLACE FUNCTION getRows()
RETURNS TABLE (
        "Name" character varying
       ,"Address" text
       ,"Phone" text
       ,"Email" character varying
       ,"Tin" character varying
       ,"DL.No1, DL.No2" text
       ,"Area" character varying
) AS
$func$
BEGIN
       select  acname as "Name", coalesce(nullif(concat_ws(', ', nullif(add1, ''),  
       nullif(add2, '')), ''), 'NIL') "Address", coalesce(nullif(concat_ws(', ', 
       nullif(phoneoff, ''), nullif(mobile, '')), ''), 'NIL') "Phone",case when email 
       <>'' then email else 'NIL' end as "Email",case when email <>'' then tin else 
       'NIL' end as "Tin",case when dlno1 ||', '||dlno2=', ' then 'NIL' else dlno1 ||',  
       '||dlno2 end as "DL.No1, DL.No2",areaname as "Area" from gtab12   left  join 
      gtab47 using(areaid) where acgrcode  = '204'  order by areaname,"Name";
END
$func$  LANGUAGE plpgsql;

select getRows() 错误正在发生时

     ERROR:  query has no destination for result data
      HINT:  If you want to discard the results of a SELECT, use PERFORM instead.
   CONTEXT:  PL/pgSQL function getRows() line 4 at SQL statement 

下面给出的实际上是 function getRow内的选择查询返回的内容。 enter image description here

2 个答案:

答案 0 :(得分:2)

如果没有SELECT子句,则无法在plpgsql函数中使用INTO语句(您必须使用PERFORM代替)。

你也忘记RETURN了。

但是,如果你的功能很简单,你可以使用普通的sql function(甚至是view)。

答案 1 :(得分:1)

要返回一组内容,您需要使用RETURN NEXT(一次返回一行)或RETURN QUERY(返回查询产生的行数)。

请参阅有关返回值的manual部分。

您的示例函数需要具有:

RETURN QUERY SELECT....;
RETURN;

注意需要第二个RETURN - 这是必需的,因为在函数退出之前可能有多个RETURN QUERY语句。