Una función definida por el usuario ( UDF , por sus siglas en inglés) es una función proporcionada por el usuario de un programa o entorno, en un contexto donde se suele asumir que las funciones están integradas en el programa o entorno. Las UDF generalmente se escriben para satisfacer las necesidades de su creador.
Lenguaje BASIC
En algunas implementaciones antiguas del lenguaje de programación BASIC , las funciones definidas por el usuario se definen mediante la sintaxis "DEF FN". Las versiones más modernas de BASIC están influenciadas por el paradigma de programación estructurada , donde la mayor parte o la totalidad del código se escribe como funciones o procedimientos definidos por el usuario, y el concepto se vuelve prácticamente redundante.
lenguaje COBOL
En el lenguaje de programación COBOL , una función definida por el usuario es una entidad que se define mediante un párrafo FUNCTION-ID. Una función definida por el usuario debe devolver un valor, lo cual se especifica en la frase RETURNING del encabezado de la división de procedimiento, y se invoca mediante la sintaxis del identificador de función. Consulte la norma ISO/IEC 1989:2014, Lenguaje de Programación COBOL, para obtener más detalles.
A partir de mayo de 2022, el compilador IBM Enterprise COBOL para z/OS 6.4 ( IBM COBOL ) incluye soporte para funciones definidas por el usuario.
Bases de datos
En los sistemas de gestión de bases de datos relacionales , una función definida por el usuario proporciona un mecanismo para extender la funcionalidad del servidor de base de datos mediante la adición de una función que puede evaluarse con sentencias de lenguaje de consulta estándar (generalmente SQL ). El estándar SQL distingue entre funciones escalares y funciones de tabla. Una función escalar devuelve un único valor (o NULL ), mientras que una función de tabla devuelve una tabla (relacional) con cero o más filas, cada una con una o más columnas.
Las funciones definidas por el usuario en SQL se declaran mediante la CREATE FUNCTIONinstrucción `convert()`. Por ejemplo, una función definida por el usuario que convierte grados Celsius a Fahrenheit (una escala de temperatura utilizada en EE. UU.) podría declararse de esta manera:
CREAR FUNCIÓN dbo.CtoF ( Celsius FLOAT ) DEVUELVE FLOAT DEVOLVER ( Celsius * 1.8 ) + 32Una vez creada, una función definida por el usuario puede utilizarse en expresiones de sentencias SQL. Por ejemplo, puede invocarse donde se permiten la mayoría de las demás funciones intrínsecas. Esto también incluye las sentencias SELECT , donde la función puede utilizarse contra datos almacenados en tablas de la base de datos. Conceptualmente, la función se evalúa una vez por fila en este tipo de uso. Por ejemplo, supongamos una tabla llamada Elements, con una fila para cada elemento químico conocido. La tabla tiene una columna llamada BoilingPoint para el punto de ebullición de ese elemento, en grados Celsius. La consulta
SELECCIONAR Nombre , CtoF ( PuntoDeEbullición ) DE ElementosRecuperará el nombre y el punto de ebullición de cada fila. Invoca la CtoFfunción definida por el usuario, tal como se declaró anteriormente, para convertir el valor de la columna a un valor en grados Fahrenheit.
Cada función definida por el usuario posee ciertas propiedades o características. El estándar SQL define las siguientes propiedades:
- Lenguaje: define el lenguaje de programación en el que se implementa la función definida por el usuario; algunos ejemplos son SQL, C, C# y Java.
- Estilo de parámetros: define las convenciones que se utilizan para pasar los parámetros y resultados de la función entre la implementación de la función y el sistema de base de datos (solo aplicable si el lenguaje no es SQL).
- Nombre específico: un nombre para la función que sea único dentro de la base de datos. Tenga en cuenta que el nombre de la función no tiene por qué ser único, considerando las funciones sobrecargadas . Algunas implementaciones de SQL requieren que los nombres de las funciones sean únicos dentro de una base de datos y no permiten funciones sobrecargadas.
- Determinismo: especifica si la función es determinista o no. Esta característica influye en el optimizador de consultas al compilar una sentencia SQL.
- Acceso a datos SQL: indica al sistema de gestión de bases de datos si la función no contiene sentencias SQL (NO SQL), contiene sentencias SQL pero no accede a ninguna tabla o vista (CONTAINS SQL), lee datos de tablas o vistas (READS SQL DATA) o modifica datos en la base de datos (MODIFIES SQL DATA).
Las funciones definidas por el usuario no deben confundirse con los procedimientos almacenados . Los procedimientos almacenados permiten al usuario agrupar un conjunto de comandos SQL. Un procedimiento puede aceptar parámetros y ejecutar sus sentencias SQL en función de dichos parámetros. Un procedimiento no es una expresión y, por lo tanto, no puede utilizarse como una función definida por el usuario.
Algunos sistemas de gestión de bases de datos permiten crear funciones definidas por el usuario en lenguajes distintos de SQL. Microsoft SQL Server , por ejemplo, permite utilizar lenguajes .NET, incluido C#, para este fin. DB2 y Oracle admiten funciones definidas por el usuario escritas en lenguajes de programación C o Java.
SQL Server 2000
En Microsoft SQL Server 2000 existen tres tipos de funciones definidas por el usuario (UDF) : funciones escalares , funciones con valores de tabla en línea y funciones con valores de tabla de varias instrucciones.
Las funciones escalares devuelven un único valor de datos (no una tabla) con la cláusula RETURNS. Pueden usar todos los tipos de datos escalares, con excepción de los tipos de datos de marca de tiempo y los definidos por el usuario. Las funciones con valores de tabla en línea devuelven el conjunto de resultados de una única instrucción SELECT. Las funciones con valores de tabla de múltiples instrucciones devuelven una tabla, que se construyó con varias instrucciones TRANSACT-SQL .
Las funciones definidas por el usuario pueden invocarse desde una consulta, al igual que las funciones integradas como OBJECT_ID, LEN, DATEDIFF, o pueden ejecutarse mediante una instrucción EXECUTE, como los procedimientos almacenados.
Notas de interpretación:
- En Microsoft SQL Server 2000, una función con valores de tabla que "envuelve" una vista puede ser mucho más rápida que la vista misma. La siguiente función, MyFunction, es un ejemplo de una "función envolvente" que se ejecuta más rápido que la vista subyacente MyView:
CREATE FUNCTION MyFunction () RETURNS @Tbl TABLE ( StudentID VARCHAR ( 255 ), SAS_StudentInstancesID INT , Label VARCHAR ( 255 ), Value MONEY , CMN_PersonsID INT ) AS BEGIN INSERT @Tbl ( StudentID , SAS_StudentInstancesID , Label , Value , CMN_PersonsID ) SELECT StudentID , SAS_StudentInstancesID , Label , Value , CMN_PersonsID FROM MyView -- donde MyView selecciona (con uniones) las mismas columnas de tablas grandesFIN DE RETORNO
- En Microsoft SQL Server 2005, el resultado de la misma ejecución de código es el opuesto: la vista se ejecuta más rápido que el "envoltorio de la función".
Las funciones definidas por el usuario son subrutinas compuestas por una o más instrucciones Transact-SQL que permiten encapsular código para su reutilización. Reciben cero o más argumentos y evalúan un valor de retorno. Su cuerpo contiene instrucciones de control de flujo y DML, similares a los procedimientos almacenados. No permiten cambios en el estado global de la sesión, como modificaciones en la base de datos o recursos externos, como archivos o redes. No admiten parámetros de salida. Se debe especificar la palabra clave DEFAULT para pasar el valor predeterminado del parámetro. Los errores en las funciones definidas por el usuario provocan su interrupción, lo que a su vez interrumpe la instrucción que las invocó.
CREATE FUNCTION CubicVolume -- Dimensiones de entrada en centímetros ( @CubeLength decimal ( 4 , 1 ), @CubeWidth decimal ( 4 , 1 ), @CubeHeight decimal ( 4 , 1 ) ) RETURNS decimal ( 12 , 3 ) AS BEGIN RETURN ( @CubeLength * @CubeWidth * @CubeHeight ) ENDColmena Apache
Apache Hive define, además de las funciones definidas por el usuario (UDF) habituales, también funciones de agregación definidas por el usuario (UDAF) y funciones de generación de tablas (UDTF). [ 1 ] Hive permite a los desarrolladores crear sus propias funciones personalizadas con Java. [ 2 ]
Apache Doris
Apache Doris, una base de datos analítica en tiempo real de código abierto, permite a los usuarios externos contribuir con sus propias UDF escritas en C++. [ 3 ]
Referencias
Enlaces externos
- Referencia de Microsoft SQL Server para CREATE FUNCTION
- Sección del manual de MySQL sobre funciones definidas por el usuario (UDF)
- Sentencia DB2 CREATE FUNCTION
- Bases de datos
- SQL
- Subrutinas