2012-03-19 1 views
7

Postgres noobie qui.Come faccio a fare riferimento ai parametri denominati nelle funzioni sql di Postgres?

Sto provando a convertire un processo memorizzato SQL Server in una funzione Postgres. Attualmente non riesco a capire come trasformare questa linea SQL in 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) 

che sto ricevendo l'errore "colonna n non esiste." Come faccio a fare riferimento ai parametri nelle istruzioni selezionate nelle funzioni di Postgres?

UPDATE:

Definizione della funzione 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; 

risposta

13

I nomi dei parametri sono puramente decorativi quando la funzione è in language SQL. È possibile utilizzare i parametri per nome nelle stored procedure definite come language plpgsql.

Di conseguenza, è necessario fare riferimento alla funzione args utilizzando $ X dove X è la posizione ordinale dell'elenco degli argomenti della funzione (a partire da 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

per punto s' @a_horse_with_no_name su un'altra risposta, di nome supporto è presente dal 9.2 http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL- FUNZIONE-ARGOMENTI –

8

Non è possibile utilizzare il nome parametri in una funzione che è definita con il linguaggio SQL =.

È necessario utilizzare il segnaposto $ 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; 

Questo comportamento viene documentato nel manuale: http://www.postgresql.org/docs/9.0/static/xfunc-sql.html

Per quanto riguarda la funzione SQL in sé è interessato, questi nomi sono solo decorazione; è comunque necessario fare riferimento ai parametri da $ 1, $ 2, ecc all'interno del corpo della funzione

Modifica

Dalla versione 9.2 è possibile utilizzare i parametri denominati con la funzione (normale) SQL
http://www.postgresql.org/docs/9.2/static/xfunc-sql.html#XFUNC-SQL-FUNCTION-ARGUMENTS