PL / PgSQL:RETURNS TABLE输出以逗号分隔,没有值

时间:2011-09-07 22:21:54

标签: sql postgresql parameters plpgsql

以下PL / pgSQl脚本返回正确的行数,但输出是括号中逗号分隔值的列表,如下所示:

(,,)(,,)(,,)(,,)(,,)。 。 (,,)

CREATE OR REPLACE FUNCTION Get_Airports_in_Country(countryCode TEXT) 
RETURNS TABLE(gid int, iko text, name text) AS $$
 DECLARE
    cntry_geom cntry02.the_geom%TYPE;       
 BEGIN   
    SELECT the_geom INTO cntry_geom from cntry02 where iso_2digit = $1;

    RETURN QUERY
    SELECT gid, iko, name
      FROM airport
     WHERE ST_Within(the_geom, cntry_geom);
 END;
$$
LANGUAGE plpgsql;

SELECT Get_Airports_in_Country('CA');

我正在使用PostgreSQL 8.4。

知道我在这里缺少什么吗?

2 个答案:

答案 0 :(得分:3)

可能看起来像这样:

CREATE OR REPLACE FUNCTION get_airports_in_country(text)
RETURNS TABLE(gid int, iko text, name text) AS $x$
DECLARE
-- $1 .. countryCode text   -- just one way to comment
   cntry_geom cntry02.the_geom%TYPE;       
BEGIN

cntry_geom := c.the_geom FROM cntry02 c WHERE c.iso_2digit = $1;

RETURN QUERY
SELECT a.gid, a.iko, a.name
  FROM airport a
 WHERE ST_Within(a.the_geom, cntry_geom);

END;
$x$
LANGUAGE plpgsql;

呼叫:

SELECT * FROM get_airports_in_country('CA');

主要观点:

  • 无论如何,定义IN参数的名称并没有多少用途。导致不必要的命名冲突。在这种情况下,请添加评论。
  • 命名冲突是您的核心问题。当您使用名称gidikonamereuse作为OUT参数(在RETURNS TABLE ..中)时,您必须在函数体中限定相同的列名。 - > a.gid, a.iko, a.name。 PostgreSQL 9.1对这些东西更严格,并抛出错误。本来可以帮到你,但是你可以使用8.4。
  • 在postgres中使用混合大小写标识符没有意义,只要你不加双引号即可。 (但这没错。)
  • 这称为功能存储过程。与“PL / pgSQl脚本”最接近的是DO statement, introduced in PostgreSQL 9.0的“匿名代码块”。

答案 1 :(得分:1)

你应该使用不同的查询

SELECT * FROM Get_Airports_in_Country('CA');