Es necesario dar de alta el lenguaje procedural que se va a emplear en
cada base de datos o, alternativamente, el usuario postgres
puede darlos de alta en la base template1
y desde ese momento
todas las bases que sean creadas heredarán estos lenguajes.
En primer lugar es necesario crear la función que se encargará de procesar el lenguaje:
DROP FUNCTION plpgsql_call_handler (); CREATE FUNCTION plpgsql_call_handler () RETURNS OPAQUE AS '/usr/lib/pgsql/plpgsql.so' LANGUAGE 'C';
En este caso el directorio es el que corresponde en caso de
que se haya instalado PostgreSQL desde un rpm
de RedHat. Por
supuesto, si se instaló PostgreSQL compilándolo (muy sana opción), el
directorio correspondiente será /usr/local/pgsql/lib/...
.
El tipo OPAQUE
le indica al DBMS que la función regresa un tipo
que no es de los construidos o definidos por el DBMS y que el valor
retornado no es usable directamente dentro de un comando SQL.
Después de crear la función handler
, debemos de dar de alta el
lenguaje en sí y, de nuevo, por sanidad primero borramos la referencia
a un posible intento previo, aunque cabe aclarar que cualquier función
en lenguaje procedural que se haya creado con anterioridad dejará de
funcionar, porque en pg_proc
, lugar donde se almacenan las
funciones, quedará la referencia al oid
anterior del
lenguaje. Esto es muy importante, una vez que se haya dado de alta el
lenguaje, todas las funciones creadas, harán referencia al oid
con que fué creado y lo mismo se aplica al lenguaje con respecto a la
función handler
que lo invoca.
DELETE FROM pg_language WHERE lanname='plpgsql'; CREATE TRUSTED PROCEDURAL LANGUAGE 'plpgsql' HANDLER plpgsql_call_handler LANCOMPILER 'PL/pgSQL';
En adelante podremos utilizar el lenguaje procedural SQL. El parámetro
TRUSTED
, como su nombre lo indica, se refiere a que dicho
lenguaje, es confiable para la base de datos. Esto permite que
cualquier usuario sin atribuciones de súper usuario puede crear
funciones y triggers. Esto se debe a que el lenguaje es interpretado
dentro del backend
de la base de datos y podría tener acceso a
funciones internas y al sistema de archivos, con gran riesgo. PL/pgSQL
y PL/Tcl son confiables en el sentido de que no permiten accesar
dichas partes del backend
.
El mecanismo de ejecución de funciones definidas en lenguajes
procedurales es a grosso modo el siguiente: uno de los
argumentos dados al manejador es el OID
de la función en la
tabla pg_proc
. El manejador examina varios catálogos del
sistema y analiza los argumentos de llamada y el tipo de dato a
regresar. El código fuente de la función reside en el campo
prosrc
de la tabla pg_proc
.
Debido a esto último, y en contraste con las funciones en C, las funciones en lenguajes procedurales pueden ser sobrecargadas al igual que las escritas en SQL. Se pueden tener varias funciones con el mismo nombre, siempre y cuando los argumentos con que son llamadas difieran en número o en tipo.