PL/PgSQL: RETURNS TABLE output is comma delimited without values
The following PL/pgSQl script returns the correct number of rows, but the output is a list of开发者_如何学C comma separated values in brackets as follows:
(,,) (,,) (,,) (,,) (,,) . . (,,)
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');
I am using PostgreSQL 8.4.
Any idea what I am missing here?
It might look like this:
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;
Call:
SELECT * FROM get_airports_in_country('CA');
Major points:
- There is not much use in defining names for IN parameters that you are going to reference by number anyway. Leads to unnecessary naming conflicts. Add a comment instead, in such a case.
 - A naming conflict is your core problem. As you use the names 
gid,iko,namereuseas OUT parameters (in theRETURNS TABLE..), you have to qualify the identical column names in the function body. ->a.gid, a.iko, a.name. PostgreSQL 9.1 is stricter about that stuff and throws errors. Would have helped you, but you run on 8.4. - No point in using mixed case identifiers in postgres, as long as you don't double quote them. (It's not wrong, though.)
 - This is called a function or stored procedure. The closest thing to a "PL/pgSQl script" would be the "anonymous code block" of a 
DOstatement, introduced in PostgreSQL 9.0. 
you should to use a different query
SELECT * FROM Get_Airports_in_Country('CA');
 加载中,请稍侯......
      
精彩评论