PL / PgSQL: выход RETURNS TABLE разделяется запятой без значений - PullRequest
1 голос
/ 08 сентября 2011

Следующий скрипт 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 ]

3 голосов
/ 06 октября 2011

Это может выглядеть так:

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, на которые вы все равно будете ссылаться по номеру. Приводит к ненужным конфликтам имен. Вместо этого добавьте комментарий, в таком случае.
  • A конфликт имен - это ваша основная проблема. Поскольку вы используете имена gid, iko, namereuse в качестве параметров OUT (в RETURNS TABLE ..), вы должны квалифицировать идентичные имена столбцов в теле функции. -> a.gid, a.iko, a.name. PostgreSQL 9.1 строже относится к этому и выдает ошибки. Помог бы вам, но вы работаете на 8.4.
  • Нет смысла использовать идентификаторы смешанного регистра в postgres, если вы не заключите их в двойные кавычки. (Хотя это не так.)
  • Это называется функция или хранимая процедура . Наиболее близким к «сценарию PL / pgSQl» будет «блок анонимного кода» оператора DO, представленный в PostgreSQL 9.0 .
1 голос
/ 18 сентября 2011

Вы должны использовать другой запрос

SELECT * FROM Get_Airports_in_Country('CA');
...