41.1. Descripción general #

41.1.1. Ventajas de usar PL/pgSQL
41.1.2. Tipos de datos de argumentos y resultados soportados

PL/pgSQL es un lenguaje procedimental cargable para el sistema de bases de datos PostgreSQL. Los objetivos de diseño de PL/pgSQL fueron crear un lenguaje procedimental cargable que

Las funciones creadas con PL/pgSQL se pueden usar en cualquier lugar donde se puedan utilizar las funciones integradas. Por ejemplo, es posible crear funciones de cálculo condicional complejo y luego usarlas para definir operadores o emplearlas en expresiones de índice.

En PostgreSQL 9.0 y versiones posteriores, PL/pgSQL se instala por defecto. Sin embargo, sigue siendo un módulo cargable, por lo que los administradores especialmente preocupados por la seguridad podrían optar por eliminarlo.

41.1.1. Ventajas de usar PL/pgSQL #

SQL es el lenguaje que utilizan PostgreSQL y la mayoría de las demás bases de datos relacionales como lenguaje de consulta. Es portable y fácil de aprender. Pero cada instrucción SQL debe ser ejecutada individualmente por el servidor de la base de datos.

Esto significa que tu aplicación cliente debe enviar cada consulta al servidor de la base de datos, esperar a que se procese, recibir y procesar los resultados, realizar algunos cálculos y luego enviar más consultas al servidor. Todo esto implica comunicación entre procesos y también generará sobrecarga de red si tu cliente se encuentra en una máquina diferente a la del servidor de la base de datos.

Con PL/pgSQL puedes agrupar un bloque de cálculo y una serie de consultas dentro del servidor de la base de datos, teniendo así el poder de un lenguaje procedimental y la facilidad de uso de SQL, pero con un ahorro considerable en la sobrecarga de comunicación cliente/servidor.

  • Se eliminan los viajes de ida y vuelta (round trips) adicionales entre el cliente y el servidor

  • Los resultados intermedios que el cliente no necesita no tienen que ser empaquetados ni transferidos entre el servidor y el cliente

  • Se pueden evitar múltiples rondas de análisis (parsing) de consultas

Esto puede resultar en un aumento considerable del rendimiento en comparación con una aplicación que no utiliza funciones almacenadas.

Además, con PL/pgSQL puedes usar todos los tipos de datos, operadores y funciones de SQL.

41.1.2. Tipos de datos de argumentos y resultados soportados #

Las funciones escritas en PL/pgSQL pueden aceptar como argumentos cualquier tipo de datos escalar o de array soportado por el servidor, y pueden devolver un resultado de cualquiera de estos tipos. También pueden aceptar o devolver cualquier tipo compuesto (tipo de fila) especificado por su nombre. También es posible declarar que una función de PL/pgSQL acepta record, lo que significa que cualquier tipo compuesto servirá como entrada, o que devuelve record, lo que significa que el resultado es un tipo de fila cuyas columnas se determinan por la especificación en la consulta que la llama, como se analiza en la Section 7.2.1.4.

Las funciones de PL/pgSQL se pueden declarar para aceptar un número variable de argumentos utilizando el marcador VARIADIC. Esto funciona exactamente de la misma manera que para las funciones SQL, como se analiza en la Section 36.5.6.

Las funciones de PL/pgSQL también se pueden declarar para aceptar y devolver los tipos polimórficos descritos en la Section 36.2.5, lo que permite que los tipos de datos reales manejados por la función varíen de una llamada a otra. Los ejemplos aparecen en la Section 41.3.1.

Las funciones de PL/pgSQL también se pueden declarar para devolver un conjunto (o tabla) de cualquier tipo de datos que se pueda devolver como una sola instancia. Dicha función genera su salida ejecutando RETURN NEXT para cada elemento deseado del conjunto de resultados, o usando RETURN QUERY para generar el resultado de evaluar una consulta.

Finalmente, una función de PL/pgSQL se puede declarar para devolver void si no tiene un valor de retorno útil. (Alternativamente, se podría escribir como un procedimiento en ese caso).

Las funciones de PL/pgSQL también se pueden declarar con parámetros de salida en lugar de una especificación explícita del tipo de retorno. Esto no agrega ninguna capacidad fundamental al lenguaje, pero a menudo resulta conveniente, especialmente para devolver múltiples valores. La notación RETURNS TABLE también se puede usar en lugar de RETURNS SETOF.

Los ejemplos específicos aparecen en la Section 41.3.1 y en la Section 41.6.1.