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
pueda usarse para crear funciones, procedimientos y disparadores (triggers),
agregue estructuras de control al lenguaje SQL,
pueda realizar cálculos complejos,
herede todos los tipos definidos por el usuario, funciones, procedimientos y operadores,
pueda definirse para que sea de confianza (trusted) por el servidor,
sea fácil de usar.
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.
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.
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.