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');
加载中,请稍侯......
精彩评论