next up previous contents index
Next: Usando PL/pgSQL Up: Lenguajes procedurales Previous: Lenguajes procedurales   Índice General   Índice de Materias


Instalando lenguajes procedurales

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.


next up previous contents index
Next: Usando PL/pgSQL Up: Lenguajes procedurales Previous: Lenguajes procedurales   Índice General   Índice de Materias
Ismael Olea 2001-04-21