A partir del lanzamiento de la versión 6.3, Postgres soporta la definición de lenguajes procedurales. En el caso de una función o procedimiento definido en un lenguaje procedural, la base de datos no tiene un conocimiento implícito sobre como interpretar el código fuente de las funciones. El manejador en sí es una función de un lenguaje de programación compilada en forma de objeto compartido, y cargado cuando es necesario.
Instalación de lenguajes procedurales
Un lenguaje procedural se instala en la base de datos en tres pasos.
El objeto compartido que contienen el manejador del lenguaje ha de ser compilado e instalado. Por defecto, el manejador para PL/pgSQL está integrado e instalado en el directorio de bibliotecas de la base de datos. Si el soporte de Tcl/Tk está instalado y configurado, el manejador para PL/Tcl está integrado e instalado en el mismo sitio.
La escritura de un nuevo lenguaje procedural (Procedural language, PL) está mas allá del ámbito de este manual.
El manejador debe ser declarado mediante la orden
CREATE FUNCTION handler_function_name () RETURNS OPAQUE AS 'path-to-shared-object' LANGUAGE 'C'; |
El PL debe ser declarado con la orden
CREATE [ TRUSTED ] PROCEDURAL LANGUAGE 'language-name' HANDLER handler_function_name LANCOMPILER 'description'; |
Ejemplo
La siguiente orden le dice a la base de datos donde encontrar el objeto compartido para el manejador de funciones que llama al lenguaje PL/pgSQL
CREATE FUNCTION plpgsql_call_handler () RETURNS OPAQUE AS '/usr/local/pgsql/lib/plpgsql.so' LANGUAGE 'C'; |
La orden
CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql' HANDLER plpgsql_call_handler LANCOMPILER 'PL/pgSQL'; |
define que la función manejadora de llamadas previamente declarada debe ser invocada por las funciones y procedimientos disparadores cuando el atributo del lenguaje es 'plpgsql'
Las funciones manejadoras de PL tienen una interfase de llamadas especial distinta del de las funciones de lenguaje C normales. Uno de los argumentos dados al manejador es el identificador del objeto en las entradas de la tabla pg_proc para la función que ha de ser ejecutada. El manejador examina varios catálogos de sistema para analizar los argumentos de llamada de la función y los tipos de dato que devuelve. El texto fuente del cuerpo de la función se encuentra en el atributo prosrc de pg_proc. Debido a esto, en contraste con las funciones de lenguaje C, las funciones PL pueden ser sobrecargadas, como las funciones del lenguaje SQL. Puede haber múltiples funciones PL con el mismo nombre de función, siempre que los argumentos de llamada sean distintos.
Los lenguajes procedurales definidos en la base de datos template1 se definen automáticamente en todas las bases de datos creadas subsecuentemente. Así que el administrador de la base de datos puede decidir que lenguajes están definidos por defecto.