sql >> Base de Datos >  >> RDS >> PostgreSQL

Funciones con número variable de parámetros de entrada

Funciones avanzadas como VARIADIC o incluso los tipos de entrada polimórficos y el SQL dinámico son muy potentes. El último capítulo de esta respuesta proporciona un ejemplo avanzado:

  • Refactorice una función PL/pgSQL para devolver el resultado de varias consultas SELECT

Pero para un caso simple como el suyo, puede usar valores predeterminados para los parámetros de la función. Todo depende de los requisitos exactos.
Si las columnas en cuestión están todas definidas NOT NULL , esto probablemente sería más simple y rápido:

CREATE OR REPLACE FUNCTION update_site(_name      text    -- always required
                                     , _city      text    DEFAULT NULL
                                     , _telephone integer DEFAULT NULL)
  RETURNS integer AS
$func$
BEGIN
   IF _city IS NULL AND _telephone IS NULL THEN
      RAISE WARNING 'At least one value to update required!';
      RETURN;  -- nothing to update
   END IF;

   UPDATE "Sites"
   SET    "City"      = COALESCE(_city, "City")
        , "Telephone" = COALESCE(_telephone, "Telephone")
   WHERE  "SiteName"  = _name;
END
$func$  LANGUAGE plpgsql;

¡Lea sobre los valores predeterminados en el manual!

Para evitar conflictos de nombres entre los parámetros y los nombres de las columnas, tengo el hábito de prefijar los parámetros de entrada con _ . Eso es cuestión de gustos y estilo.

  • El primer parámetro name no tiene valor predeterminado, ya que se requiere en todo momento.
  • Se pueden omitir otros parámetros.
  • Se requiere al menos uno, o una WARNING se eleva y no pasa nada más.
  • La UPDATE solo cambiará las columnas para los parámetros dados.
  • Se puede expandir fácilmente para N parámetros.

Llamada de función

Desde Postgres 9.5 :

La forma simple es con notación posicional para parámetros. Esto solo permite omitir los parámetros más a la derecha:

SELECT update_site('foo', 'New York');  -- no telephone

Notación con nombre permite omitir any parámetro que tiene un valor predeterminado:

SELECT update_site(name => 'foo', _telephone => 123);  -- no city

Ambos se pueden combinar en notación mixta :

SELECT update_site('foo', _telephone => 123);  -- still no city

En Postgres 9.4 o anterior, := se utilizó para la asignación en la llamada:

SELECT update_site(name := 'foo', _telephone := 123);
SELECT update_site('foo', _telephone := 123);

Sigue siendo válido en Postgres 12 por compatibilidad con versiones anteriores, pero utilice la notación moderna.