CREATE FUNCTION

Nombre

CREATE FUNCTION — Definir una función nueva
CREATE FUNCTION name ( [ ftype [, ...] ] )
    RETURNS rtype
    [ WITH ( attribute [, ...] ) ]
    AS definition   
    LANGUAGE 'langname'


CREATE FUNCTION name ( [ ftype [, ...] ] )
    RETURNS rtype
    [ WITH ( at [, ...] ) ]
    AS obj_file , link_symbol  
    LANGUAGE 'C'
  

Entradas

name

El nombre de la función a crear.

ftype

El tipo de dato de los argumentos de la función. El tipo de datos de entrada será básico, complejo u opaque. opaque indica que la función accepta argumentos de un tipo no valido como por ejemplo.char *.

rtype

El tipo de datos que será devuelto. El tipo de datos que será devuelto puede ser declarado como tipo básico, complejo, tipo setof u opaque. Modificadores setof indican que la función devolverá un grupo de objetos, antes que un solo objeto.

attribute

Atributo opcional con información sobre la función, usado para optimar. El único atributo soportado hasta el momento es iscachable. iscachable indica que la función devuelve el mismo resultado siempre que reciba los mismos valores de entrada (p.e., no hace busquedas de base de datos o usa de otra manera información que no está presente en su lista de parámetros). El optimador usa iscachable para saber si es seguro pre-evaluar una ejecución de la función

definition

Una cadena de letras que define la función y cuyo sentido depende del lenguaje. Puede ser un nombre interno de función, el sendero a un fichero de objeto, una cuestión en SQL o texto en un lenguaje procedural.

obj_file , link_symbol

Esta forma de la clausula AS se usa para funciónes C de enláce dinámico siempre que el nombre de la función en el codigo fuente C no es el mismo que el nombre de la función SQL. La cadena de letras obj_file es el nombre del fichero que contiene el objecto que puede ser cargado de modo dinámico, y link_symbol, es el símbolo del enlace al objecto que puede ser cargado de forma dinámica, cuyo nombre es el mismo que el nombre de la función en el codigo fuente C.

langname

Puede ser 'C', 'sql', 'internal' o 'plname', donde 'plname' es el nombre de un lenguaje procedural creado. Ver CREATE LANGUAGE para más detalles.

Salidas

CREATE

Esto será devuelto siempre que la orden termina con exito.

Descripción

CREATE FUNCTION permite a un usuario de Postgres registrar una función con la base de datos. Después este usuario será tratado como propietario de esta función.

Notas

Preste atención al capítulo en la PostgreSQL guia del programador de como desenvolver Postgres con funciónes para más información sobre como escribir funciónes externas.

Usar DROP FUNCTION para borrar funciónes definidas por el usuario.

Postgres permite "sobrecarga" de funciónes; quiere decir, que un solo nombre puede ser usado para definir distintas funciónes mientras tengan distintos tipos de argumentos. Esta capacidad tiene que ser usada con precaución con funciónes internal y funciónes C.

Dos funciónesinternal no pueden tener el mismo nombre C sin causar errores en el momento de enlance. Para poder esquivar este hecho, hay que definir nombres diferentes C (p.e. usando los tipos de argumentos como parte de los nombres C) y después declarar los nombres en la clausula AS de CREATE FUNCTION. Siempre que la clausula AS quede en blanco,CREATE FUNCTION supone que el nombre C de la función es el mismo que el nombre SQL.

Cuando se sobrecargan funciónes SQL con funciónes C, hay que dar a cada instancia de la función un nombre distinto y usar la forma alternativa the la clausula AS en el síntaxis de CREATE FUNCTION para asegurar que los nombres de las funciónes SQL sobrecargadas sean relacionados con los objetos de enlace dinámico correctos.

Una función C no puede devolver una serie de valores.

Uso

Para crear una función SQL simple:

CREATE FUNCTION one() RETURNS int4
    AS 'SELECT 1 AS RESULT'
    LANGUAGE 'sql';
SELECT one() AS answer;

       answer 
    ------
    1
   
  

Este ejemplo crea una función C ejecutando una rutina de una libreria distribuida creada por el usuario. Esta rutina particular calcula un digito de prueba y devuelve TRUE (SI), simpre que el digito de prueba en la función es correcto. La intención es usar esta función en un constraint CHECK.

CREATE FUNCTION ean_checkdigit(bpchar, bpchar) RETURNS bool
    AS '/usr1/proj/bray/sql/funcs.so' LANGUAGE 'c';
    
CREATE TABLE product (
    id        char(8) PRIMARY KEY,
    eanprefix char(8) CHECK (eanprefix ~ '[0-9]{2}-[0-9]{5}')
                      REFERENCES brandname(ean_prefix),
    eancode   char(6) CHECK (eancode ~ '[0-9]{6}'),
    CONSTRAINT ean    CHECK (ean_checkdigit(eanprefix, eancode))
);
  

Este ejemplo crea una función que hace una conversión entre el tipo definido por el usuario complejo y el tipo interno point. La función es implementada por un objeto cargado dínamico que fue compilado de codigo fuente C. Para que Postgres encuentre automaticamente una función de conversión de tipos, la función SQL debe llamarse igual que el tipo a devolver y sobrecarga es inevitable. El nombre de la función es sobrecargado usando la segunda forma de la clausula AS de la definición SQL

CREATE FUNCTION point(complex) RETURNS point
    AS '/home/bernie/pgsql/lib/complex.so', 'complex_to_point'
    LANGUAGE 'c';
  

La declaración de la función sería:

Point * complex_to_point (Complex *z)
{
        Point *p;

        p = (Point *) palloc(sizeof(Point));
        p->x = z->x;
        p->y = z->y;
                
        return p;
}
  

Compatibilidad

SQL92

CREATE FUNCTION es una extensión de lenguaje Postgres .

SQL/PSM

Nota: PSM significa Persistent Stored Modules (módulos archivados persistentes). Es un lenguaje procedural y se esperaba que PSM fuera ratificado como estándar oficial a últimos de 1996. Hasta mediados de 1998 esto aún no ha ocurrido, pero se espera que PSM llegue a ser finalmente estándar.

SQL/PSM CREATE FUNCTION tiene el siguiente sintaxis:
CREATE FUNCTION name
    ( [ [ IN | OUT | INOUT ] type [, ...] ] )
     RETURNS rtype
     LANGUAGE 'langname'
     ESPECIFIC routine
     SQL-statement