2012-03-19 24 views
7

Postgres noobie here.¿Cómo hago referencia a los parámetros nombrados en las funciones de Postgres sql?

Estoy tratando de convertir un programa de SQL Server almacenado en una función de Postgres. Actualmente no se puede averiguar cómo convertir esta línea de SQL en 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) 

que estoy recibiendo el error "no existe la columna n". ¿Cómo hago referencia a los parámetros en las instrucciones seleccionadas en las funciones de Postgres?

ACTUALIZACIÓN:

Definición de la función de 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; 

Respuesta

13

Los nombres de los parámetros son meramente decorativos cuando su función está en language SQL. Puede usar los parámetros por nombre en procedimientos almacenados definidos como language plpgsql.

En consecuencia, debe consultar las funciones args usando $ X, donde X es la posición ordinal de la lista de argumentos de la función (comenzando con 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; 
+0

por punto @a_horse_with_no_name 's en otra respuesta, apoyo llamada ha estado presente desde 9,2 http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL- FUNCIONAMIENTO-ARGUMENTOS –

8

no puede utilizar parámetros en una función que se define con el lenguaje SQL = llamado.

Debe usar el marcador de posición $ 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; 

Este comportamiento se documenta en el manual: http://www.postgresql.org/docs/9.0/static/xfunc-sql.html

Por lo que la función de SQL en sí se refiere, estos nombres son sólo decoración; todavía se debe hacer referencia a los parámetros como $ 1, $ 2, etc dentro del cuerpo de la función

Editar

Desde la versión 9.2 es posible utilizar parámetros con nombre con la función (normal) de SQL
http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS

Cuestiones relacionadas