4.3. Llamada a funciones #

4.3.1. Uso de la notación posicional
4.3.2. Uso de la notación por nombre
4.3.3. Uso de la notación mixta

PostgreSQL permite llamar a las funciones que tienen parámetros con nombre utilizando la notación posicional o la notación por nombre. La notación por nombre es especialmente útil para funciones que tienen un gran número de parámetros, ya que hace que las asociaciones entre los parámetros y los argumentos reales sean más explícitas y confiables. En la notación posicional, una llamada a función se escribe con sus valores de argumento en el mismo orden en que están definidos en la declaración de la función. En la notación por nombre, los argumentos se asocian a los parámetros de la función por su nombre y se pueden escribir en cualquier orden. Para cada notación, considera también el efecto de los tipos de argumentos de la función, documentado en la Section 10.3.

En cualquiera de las dos notaciones, los parámetros que tienen valores por omisión especificados en la declaración de la función no necesitan escribirse en absoluto en la llamada. Pero esto es particularmente útil en la notación por nombre, ya que se puede omitir cualquier combinación de parámetros; mientras que en la notación posicional, los parámetros solo se pueden omitir de derecha a izquierda.

PostgreSQL también admite la notación mixta, que combina la notación posicional y la notación por nombre. En este caso, los parámetros posicionales se escriben primero y los parámetros por nombre aparecen después de ellos.

Los siguientes ejemplos ilustrarán el uso de las tres notaciones, utilizando la siguiente definición de función:

CREATE FUNCTION concat_lower_or_upper(a text, b text, uppercase boolean DEFAULT false)
RETURNS text
AS
$$
 SELECT CASE
        WHEN $3 THEN UPPER($1 || ' ' || $2)
        ELSE LOWER($1 || ' ' || $2)
        END;
$$
LANGUAGE SQL IMMUTABLE STRICT;

La función concat_lower_or_upper tiene dos parámetros obligatorios, a y b. Adicionalmente, hay un parámetro opcional uppercase que por omisión es false. Las entradas a y b se concatenarán y se forzarán a mayúsculas o minúsculas según el parámetro uppercase. Los detalles restantes de esta definición de función no son importantes aquí (consulta la Chapter 36 para más información).

4.3.1. Uso de la notación posicional #

La notación posicional es el mecanismo tradicional para pasar argumentos a las funciones en PostgreSQL. Un ejemplo es:

SELECT concat_lower_or_upper('Hello', 'World', true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

Todos los argumentos se especifican en orden. El resultado está en mayúsculas ya que uppercase se especifica como true. Otro ejemplo es:

SELECT concat_lower_or_upper('Hello', 'World');
 concat_lower_or_upper
-----------------------
 hello world
(1 row)

Aquí, el parámetro uppercase se omite, por lo que recibe su valor por omisión de false, lo que resulta en una salida en minúsculas. En la notación posicional, los argumentos se pueden omitir de derecha a izquierda siempre que tengan valores por omisión.

4.3.2. Uso de la notación por nombre #

En la notación por nombre, el nombre de cada argumento se especifica usando => para separarlo de la expresión del argumento. Por ejemplo:

SELECT concat_lower_or_upper(a => 'Hello', b => 'World');
 concat_lower_or_upper
-----------------------
 hello world
(1 row)

Nuevamente, el argumento uppercase se omitió, por lo que se establece en false implícitamente. Una ventaja de usar la notación por nombre es que los argumentos se pueden especificar en cualquier orden, por ejemplo:

SELECT concat_lower_or_upper(a => 'Hello', b => 'World', uppercase => true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

SELECT concat_lower_or_upper(a => 'Hello', uppercase => true, b => 'World');
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

Se admite una sintaxis más antigua basada en «:=» para compatibilidad con versiones anteriores:

SELECT concat_lower_or_upper(a := 'Hello', uppercase := true, b := 'World');
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

4.3.3. Uso de la notación mixta #

La notación mixta combina la notación posicional y la notación por nombre. Sin embargo, como ya se ha mencionado, los argumentos por nombre no pueden preceder a los argumentos posicionales. Por ejemplo:

SELECT concat_lower_or_upper('Hello', 'World', uppercase => true);
 concat_lower_or_upper
-----------------------
 HELLO WORLD
(1 row)

En la consulta anterior, los argumentos a y b se especifican posicionalmente, mientras que uppercase se especifica por su nombre. En este ejemplo, esto aporta poco excepto documentación. Con una función más compleja que tenga numerosos parámetros con valores por omisión, la notación por nombre o mixta puede ahorrar una gran cantidad de escritura y reducir las posibilidades de error.

Note

Actualmente, las notaciones de llamada por nombre y mixtas no se pueden usar al llamar a una función de agregación (pero sí funcionan cuando se usa una función de agregación como función de ventana).