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.