Как ссылаться на именованные параметры в функциях Postgres sql? - PullRequest
11 голосов
/ 19 марта 2012

Postgres noobie здесь.

Я пытаюсь преобразовать хранимую процедуру SQL Server в функцию Postgres. В настоящее время не могу понять, как превратить эту строку SQL в Postgres.

SQL Server:

input: @name = null

SELECT *
FROM table
WHERE name = ISNULL(@name, name)

Postgres:

input: n = null

SELECT *
FROM table
WHERE name = COALESCE(n, name)

Я получаю сообщение об ошибке "столбец n не существует". Как ссылаться на параметры в операторах выбора в функциях Postgres?

UPDATE:

Определение функции Postgres

CREATE OR REPLACE FUNCTION fn_name (n VARCHAR(32) = NULL, name OUT varchar(32), description OUT varchar(64))
RETURNS setof record
AS 
$$
    SELECT u.name
        , u.description
    FROM table_a u
    WHERE u.name = COALESCE(n, u.name);

$$
LANGUAGE sql;

Ответы [ 2 ]

17 голосов
/ 19 марта 2012

ПЕРЕСМОТРЕНО: Как указано в комментариях, этот ответ был точным при написании в начале 2012 года, но именованные параметры поддерживаются начиная с версии 9.2, выпущенной в конце 2012 года.

Имена параметров являются просто украшением, когда ваша функция на языке SQL . Вы можете использовать параметры по имени в хранимых процедурах, определенных как language plpgsql.

Следовательно, вы должны ссылаться на аргументы функции, используя $ X, где X - порядковый номер списка аргументов функции (начиная с 1).

CREATE OR REPLACE FUNCTION fn_name (
  n VARCHAR(32) = NULL,
  OUT name varchar(32),
  OUT description varchar(64) )
RETURNS setof record
AS 
$$
    SELECT u.name
        , u.description
    FROM table_a u
    WHERE u.name = COALESCE($1, u.name);
$$
LANGUAGE sql;
11 голосов
/ 19 марта 2012

Вы не можете использовать именованные параметры в функции, которая определена с language = SQL.

Вам необходимо использовать заполнитель $ 1.

CREATE OR REPLACE FUNCTION fn_name (n VARCHAR(32) = NULL, name OUT varchar(32), description OUT varchar(64))
RETURNS setof record
AS 
$$
    SELECT u.name
        , u.description
    FROM table_a u
    WHERE u.name = COALESCE($1, u.name);

$$
LANGUAGE sql;

Такое поведение описано в руководстве: http://www.postgresql.org/docs/9.0/static/xfunc-sql.html

Что касается самой функции SQL, эти имена являются просто украшением; вы все равно должны ссылаться на параметры как $ 1, $ 2 и т. д. в теле функции

Редактировать

Начиная с версии 9.2, можно использовать именованные параметры с (простой) функцией SQL
http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...