Fonction définie par l'utilisateur - User-defined function

Une fonction définie par l'utilisateur ( FDU ) est une fonction fournie par l'utilisateur d'un programme ou d'un environnement, dans un contexte où l'hypothèse habituelle est que les fonctions sont intégrées au programme ou à l'environnement. Les UDF sont généralement écrites pour les besoins de son créateur.

Langue de BASE

Dans certaines anciennes implémentations du langage de programmation BASIC , les fonctions définies par l'utilisateur sont définies à l'aide de la syntaxe "DEF FN". Les dialectes plus modernes du BASIC sont influencés par le paradigme de la programmation structurée , où la plupart ou la totalité du code est écrit sous forme de fonctions ou de procédures définies par l'utilisateur, et le concept devient pratiquement redondant.

Bases de données

Dans les systèmes de gestion de base de données relationnelle , une fonction définie par l'utilisateur fournit un mécanisme pour étendre la fonctionnalité du serveur de base de données en ajoutant une fonction, qui peut être évaluée dans des instructions de langage de requête standard (généralement SQL ). Le standard SQL fait la distinction entre les fonctions scalaires et les fonctions de table. Une fonction scalaire ne renvoie qu'une seule valeur (ou NULL ), alors qu'une fonction de table renvoie une table (relationnelle) comprenant zéro ou plusieurs lignes, chaque ligne avec une ou plusieurs colonnes.

Les fonctions définies par l'utilisateur dans SQL sont déclarées à l'aide de l' CREATE FUNCTIONinstruction. Par exemple, une fonction qui convertit Celsius en Fahrenheit pourrait être déclarée comme ceci :

CREATE FUNCTION dbo.CtoF(Celsius FLOAT)
  RETURNS FLOAT
  RETURN (Celsius * 1.8) + 32

Une fois créée, une fonction définie par l'utilisateur peut être utilisée dans les expressions des instructions SQL. Par exemple, il peut être invoqué là où la plupart des autres fonctions intrinsèques sont autorisées. Cela inclut également les instructions SELECT , où la fonction peut être utilisée sur les données stockées dans les tables de la base de données. Conceptuellement, la fonction est évaluée une fois par ligne dans une telle utilisation. Par exemple, supposons un tableau nommé Elements, avec une ligne pour chaque élément chimique connu. Le tableau a une colonne nommée BoilingPoint pour le point d'ébullition de cet élément, en Celsius. La requête

SELECT Name, CtoF(BoilingPoint)
  FROM Elements

récupérerait le nom et le point d'ébullition de chaque ligne. Il invoque la fonction définie par l'utilisateur CtoF comme déclaré ci-dessus afin de convertir la valeur de la colonne en une valeur en Fahrenheit.

Chaque fonction définie par l'utilisateur comporte certaines propriétés ou caractéristiques. La norme SQL définit les propriétés suivantes :

  • Langage - définit le langage de programmation dans lequel la fonction définie par l'utilisateur est implémentée ; les exemples incluent SQL, C, C# et Java.
  • Style de paramètre - définit les conventions utilisées pour transmettre les paramètres et les résultats de la fonction entre l'implémentation de la fonction et le système de base de données (applicable uniquement si le langage n'est pas SQL).
  • Nom spécifique - un nom pour la fonction qui est unique dans la base de données. Notez que le nom de la fonction n'a pas besoin d'être unique, compte tenu des fonctions surchargées . Certaines implémentations SQL exigent que les noms de fonction soient uniques dans une base de données et les fonctions surchargées ne sont pas autorisées.
  • Déterminisme - spécifie si la fonction est déterministe ou non. La caractéristique de déterminisme a une influence sur l' optimiseur de requête lors de la compilation d'une instruction SQL.
  • Accès aux données SQL - indique au système de gestion de base de données si la fonction ne contient aucune instruction SQL (NO SQL), contient des instructions SQL mais n'accède à aucune table ou vue (CONTAINS SQL), lit les données des tables ou des vues (READS SQL DATA), ou modifie réellement des données dans la base de données (MODIFIE SQL DATA).

Les fonctions définies par l'utilisateur ne doivent pas être confondues avec les procédures stockées . Les procédures stockées permettent à l'utilisateur de regrouper un ensemble de commandes SQL. Une procédure peut accepter des paramètres et exécuter ses instructions SQL en fonction de ces paramètres. Une procédure n'est pas une expression et ne peut donc pas être utilisée comme des fonctions définies par l'utilisateur.

Certains systèmes de gestion de bases de données permettent la création de fonctions définies par l'utilisateur dans des langages autres que SQL. Microsoft SQL Server , par exemple, permet à l'utilisateur d'utiliser les langages .NET dont C# à cette fin. DB2 et Oracle prennent en charge les fonctions définies par l'utilisateur écrites en langages de programmation C ou Java.

SQL Server 2000

Il existe trois types de FDU dans Microsoft SQL Server 2000 : les fonctions scalaires , les fonctions table en ligne et les fonctions table à instructions multiples .

Les fonctions scalaires renvoient une seule valeur de données (pas une table) avec la clause RETURNS. Les fonctions scalaires peuvent utiliser tous les types de données scalaires, à l'exception des types de données d'horodatage et définis par l'utilisateur. Les fonctions table en ligne renvoient le jeu de résultats d'une seule instruction SELECT. Les fonctions table à instructions multiples renvoient une table, qui a été construite avec de nombreuses instructions TRANSACT-SQL.

Les fonctions définies par l'utilisateur peuvent être appelées à partir d'une requête comme des fonctions intégrées telles que OBJECT_ID, LEN, DATEDIFF, ou peuvent être exécutées via une instruction EXECUTE comme des procédures stockées.

Notes sur les performances : 1. Sur Microsoft SQL Server 2000, une fonction table qui "encapsule" une vue peut être beaucoup plus rapide que la vue elle-même. La MyFunction suivante est un exemple de "fonction wrapper" qui s'exécute plus rapidement que la vue sous-jacente 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 -- where MyView selects (with joins) the same columns from large table(s)

    RETURN
END

2. Sur Microsoft SQL Server 2005, le résultat de la même exécution de code est l'inverse : la vue est exécutée plus rapidement que le "function-wrapper".

Les fonctions définies par l'utilisateur sont des sous-routines constituées d'une ou plusieurs instructions Transact-SQL qui peuvent être utilisées pour encapsuler du code en vue de sa réutilisation. Il prend zéro ou plusieurs arguments et évalue une valeur de retour. Possède à la fois des instructions de flux de contrôle et DML dans son corps, similaires aux procédures stockées. N'autorise pas les modifications de l'état de session global, telles que les modifications apportées à la base de données ou à une ressource externe, telle qu'un fichier ou un réseau. Ne prend pas en charge le paramètre de sortie. Le mot-clé DEFAULT doit être spécifié pour transmettre la valeur par défaut du paramètre. Les erreurs dans l'UDF provoquent l'abandon d'UDF qui, à son tour, annule l'instruction qui a appelé l'UDF.

CREATE FUNCTION CubicVolume
-- Input dimensions in centimeters
(
    @CubeLength decimal(4,1), 
    @CubeWidth  decimal(4,1),
    @CubeHeight decimal(4,1)
)
    RETURNS decimal(12,3)
AS
BEGIN
  RETURN(@CubeLength * @CubeWidth * @CubeHeight)
END

Type de données pris en charge dans Microsoft SQL Server 2000 Comme une table temporaire utilisée pour stocker les résultats Principalement utilisé pour définir une variable temporaire de type (table) et la valeur de retour d'une FDU La portée est limitée à la fonction, la procédure stockée ou le lot dans lequel elle se trouve L'opération d'affectation définie n'est pas autorisée entre les variables (tables) Peut être utilisée dans SELECT, INSERT, UPDATE et DELETE CREATE FUNCTION pour créer UDF ALTER FUNCTION pour modifier les caractéristiques de UDF DROP FUNCTION pour supprimer UDF

Ruche Apache

Apache Hive définit, en plus des fonctions définies par l'utilisateur (UDF) habituelles, des fonctions d'agrégation définies par l'utilisateur (UDAF) et des fonctions de génération de table (UDTF). Hive permet aux développeurs de créer leurs propres fonctions personnalisées avec Java.

Les références

Liens externes