Lenguajes Procedurales

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

Instalación de lenguajes procedurales

Un lenguaje procedural se instala en la base de datos en tres pasos.

  1. 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.

  2. El manejador debe ser declarado mediante la orden

        CREATE FUNCTION handler_function_name () RETURNS OPAQUE AS
            'path-to-shared-object' LANGUAGE 'C';
    		
    El calificador especial de tipo devuelto OPAQUE le dice a la base de datos que esta función no devuelve uno de los tipos definidos en la base de datos ni un tipo compuesto, y que no es directamente utilizable en una sentencia SQL.

  3. El PL debe ser declarado con la orden

        CREATE [ TRUSTED ] PROCEDURAL LANGUAGE 'language-name'
            HANDLER handler_function_name
    	LANCOMPILER 'description';
    		
    La palabra clave opcional TRUSTED indica si un usuario normal de la base de datos, sin privilegios de superusuario, puede usar este lenguaje para crear funciones y procedimientos activadores. Dado que las funciones de los PL se ejecutan dentro de la aplicación de base de datos, sólo deberían usarse para lenguajes que no puedan conseguir acceso a las aplicaciones internas de la base de datos, o al sistema de ficheros. Los lenguajes PL/pgSQL y PL/Tcl son manifiestamente fiables en este sentido

Ejemplo

  1. 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';
        
  2. 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.