Créer une fonction définie par l’utilisateur¶
Vous pouvez créer une fonction définie par l’utilisateur (UDF) en utilisant l’une des méthodes disponibles avec Snowflake. Ces méthodes sont décrites dans cette rubrique.
Créer une UDF¶
Écrivez la logique d’une fonction en tant que gestionnaire à l’aide de l’un des langages pris en charge, notamment Python, Java et Scala.
Choisissez un outil ou une API pour créer la fonction avec le gestionnaire que vous avez écrit.
Pour plus d’informations sur chacun de ces éléments, voir Outils de création d’UDFs.
SQL
Utilisez SQL et écrivez la logique dans un ou plusieurs langages.
Snowpark
Utilisez l’API Snowpark pour Java, Python ou Scala.
Ligne de commande
Exécutez les commandes CLI pour créer la fonction.
Python API
Exécutez les commandes Python côté client pour créer la fonction.
REST
Adressez des requêtes à l’API RESTful pour créer la fonction.
Exécutez la fonction à l’aide de l’un des outils suivants, selon vos besoins.
Outils de création d’UDFs¶
Vous pouvez créer une UDF en utilisant l’une des méthodes disponibles avec Snowflake, en fonction du langage et de l’ensemble des paramètres dont vous disposez. Choisissez l’outil qui correspond à vos besoins dans la table suivante.
Langage |
Approche |
---|---|
SQL Exécutez une commande SQL, par exemple en utilisant l”Snowsight. |
Exécutez la commande SQL CREATE FUNCTION pour créer une fonction avec un code gestionnaire écrit dans l’un des langages suivants : |
Java, Python ou Scala avec Snowpark Écrivez du code dans l’un des langages pris en charge, puis exécutez le code localement pour effectuer des opérations dans Snowflake. |
Exécutez le code client qui utilise les APIs Snowpark dans l’un des langages suivants. |
Ligne de commande Créez et gérez des entités Snowflake en exécutant des commandes à partir de la ligne de commande. |
Exécutez des commandes de la CLI Snowflake. |
Python Sur le client, écrivez du code qui exécute des opérations de gestion sur Snowflake. |
Exécutez du code qui utilise l’API Snowflake Python. |
APIs RESTful (indépendantes du langage) Effectuez des requêtes auprès des points de terminaison RESTful pour créer et gérer des entités Snowflake. |
Faites une requête pour créer une procédure à l’aide de l”API REST Snowflake |
Propriétés clés¶
Les paragraphes suivants décrivent certaines des propriétés requises ou généralement utilisées lors de la création d’une fonction.
- Nom de la fonction:
Le nom de la fonction ne doit pas nécessairement correspondre au nom du gestionnaire. Pour plus d’informations sur les contraintes et les conventions relatives aux noms, voir Nommage et surcharge de procédures et d’UDFs.
- Arguments:
Pour plus d’informations sur les exigences, voir Définition des arguments pour UDFs et les procédures stockées.
- Type de retour:
Pour plus d’informations sur la façon dont Snowflake fait correspondre les types de données SQL aux types de données des gestionnaires, voir Mappage des types de données entre SQL et les langages de traitement.
- Nom du gestionnaire:
Si nécessaire, il s’agit du nom de la classe ou de la méthode contenant le code qui s’exécute lorsque la fonction est exécutée. Vous devez spécifier un nom de gestionnaire uniquement pour les gestionnaires écrits en Java, Python et Scala. Pour les gestionnaires JavaScript et SQL, tout le code spécifié en ligne sera exécuté comme le gestionnaire.
- Dépendances:
Pour un gestionnaire écrit en Java, Python ou Scala, vous devrez peut-être aussi spécifier la bibliothèque Snowpark, par exemple lors de la création de la fonction.
Pour plus d’informations sur la mise à disposition des dépendances pour votre gestionnaire, voir Mettre les dépendances à la disposition de votre code.
- Environnement d’exécution du langage du gestionnaire:
Lorsque le langage du gestionnaire est Java, Python ou Scala, spécifiez la version d’exécution pour indiquer la version d’environnement d’exécution prise en charge à utiliser. Gardez à l’esprit que si vous utilisez la version par défaut, celle-ci évoluera au fil du temps.
Exigences en matière de contrôle d’accès¶
Un rôle utilisé pour exécuter cette opération doit au minimum disposer des privilèges suivants :
Privilège |
Objet |
Remarques |
---|---|---|
CREATE FUNCTION |
Schéma |
Le privilège permet uniquement la création de fonctions définies par l’utilisateur dans le schéma. Si vous souhaitez activer la création de fonctions de mesure de données, le rôle doit avoir le privilège CREATE DATA METRIC FUNCTION. |
USAGE |
Fonction |
Accorder le privilège USAGE à un rôle sur la fonction nouvellement créée permet aux utilisateurs ayant ce rôle d’appeler la fonction ailleurs dans Snowflake (comme le rôle du propriétaire de la politique de masquage pour la tokénisation externe). |
USAGE |
Intégration de l’accès externe |
Requis pour les intégrations, s’il y en a, spécifiées par le paramètre EXTERNAL_ACCESS_INTEGRATIONS. Pour plus d’informations, consultez CREATE EXTERNAL ACCESS INTEGRATION. |
READ |
Secret |
Requis pour les secrets, s’il y en a, spécifiés par le paramètre SECRETS. Pour plus d’informations, voir Création d’un secret pour représenter les identifiants de connexion et Utilisation de l’intégration de l’accès externe dans une fonction ou une procédure. |
USAGE |
Schéma |
Obligatoire pour les schémas contenant des secrets, s’il y en a, spécifiés par le paramètre SECRETS. Pour plus d’informations, voir Création d’un secret pour représenter les identifiants de connexion et Utilisation de l’intégration de l’accès externe dans une fonction ou une procédure. |
Le privilège USAGE relatif à la base de données et au schéma parents est exigé pour effectuer des opérations sur tout objet d’un schéma.
Pour obtenir des instructions sur la création d’un rôle personnalisé avec un ensemble spécifique de privilèges, voir Création de rôles personnalisés.
Pour des informations générales sur les rôles et les privilèges accordés pour effectuer des actions SQL sur des objets sécurisables, voir Aperçu du contrôle d’accès.
Notes sur l’utilisation¶
Les notes sur l’utilisation décrivent les langages pris en charge pour l’écriture des gestionnaires. Bien que les notes des sections suivantes fassent référence aux clauses de la commande SQL CREATE FUNCTION, ces clauses sont généralement représentées d’une autre manière dans d’autres outils que vous pouvez utiliser pour créer des fonctions.
Toutes les langues¶
function_definition
a des restrictions de taille. La taille maximale permise est sujette à changement.Les délimiteurs autour de la
function_definition
peuvent être des guillemets simples ou une paire de signes dollar.L’utilisation de
$$
comme délimiteur facilite l’écriture des fonctions stockées contenant des guillemets simples.Si le délimiteur du corps de la fonction est le caractère guillemet simple, tous les guillemets simples dans
function_definition
(comme les littéraux de chaînes) doivent être échappés par des guillemets simples.Si vous utilisez une UDF dans une politique de masquage, assurez-vous que le type de données de la colonne, l’UDF, et la politique de masquage correspondent. Pour plus d’informations, voir Fonctions définies par l’utilisateur dans une politique de masquage.
Si vous spécifiez la fonction CURRENT_DATABASE ou CURRENT_SCHEMA dans le code de gestionnaire (handler) de l’UDF, la fonction renvoie la base de données ou le schéma contenant l’UDF et non la base de données ou le schéma utilisé pour la session.
Concernant les métadonnées :
Attention
Les clients doivent s’assurer qu’aucune donnée personnelle (autre que pour un objet utilisateur), donnée sensible, donnée à exportation contrôlée ou autre donnée réglementée n’est saisie comme métadonnée lors de l’utilisation du service Snowflake. Pour plus d’informations, voir Champs de métadonnées dans Snowflake.
Les instructions CREATE OR REPLACE <objet> sont atomiques. En d’autres termes, lorsqu’un objet est remplacé, l’ancien objet est supprimé et le nouvel objet est créé dans une seule transaction.
Java¶
En Java, les types de données primitifs n’autorisent pas les valeurs NULL. Ainsi, transmettre une valeur NULL pour un argument d’un tel type entraîne une erreur.
Dans la clause HANDLER, le nom de la méthode est sensible à la casse.
Dans les clauses IMPORTS et TARGET_PATH :
Les noms de paquet, de classe et de fichier sont sensibles à la casse.
Le(s) nom(s) de zone de préparation sont insensibles à la casse.
Vous pouvez utiliser la clause PACKAGES pour spécifier les noms et les numéros de version du paquet pour les dépendances Snowflake définies par le système, comme celles de Snowpark. Pour les autres dépendances, spécifiez les fichiers JAR de dépendance avec la clause IMPORTS.
Snowflake valide ceci :
Le fichier JAR spécifié dans le HANDLER de l’instruction CREATE FUNCTION existe et contient la classe et la méthode spécifiées.
Les types d’entrée et de sortie spécifiés dans la déclaration UDF sont compatibles avec les types d’entrée et de sortie de la méthode Java.
La validation peut se faire au moment de la création ou de l’exécution, selon que vous êtes connecté ou non à un entrepôt Snowflake actif.
Au moment de la création — Si vous êtes connecté à un entrepôt Snowflake actif au moment de l’exécution de l’instruction CREATE FUNCTION, l’UDF est validée au moment de la création.
Au moment de l’exécution — Si vous n’êtes pas connecté à un entrepôt Snowflake actif, l’UDF est créée, mais n’est pas validée immédiatement, et Snowflake renvoie le message suivant :
Function <nom> created successfully, but could not be validated since there is no active warehouse
.
JavaScript¶
Snowflake ne valide pas le code JavaScript au moment de la création de l’UDF. En d’autres termes, la création de l’UDF se fait sans tenir compte de la validité du code. Si le code n’est pas valide, Snowflake renvoie des erreurs lorsque l’UDF est appelée au moment de la requête.
Python¶
Dans la clause HANDLER, le nom de la fonction du gestionnaire est sensible à la casse.
Dans la clause IMPORTS :
Les noms de fichiers sont sensibles à la casse.
Le(s) nom(s) de zone de préparation sont insensibles à la casse.
Vous pouvez utiliser la clause PACKAGES pour spécifier les noms et les numéros de version du paquet pour les dépendances, comme celles de Snowpark. Pour les autres dépendances, spécifiez les fichiers de dépendance avec la clause IMPORTS.
Snowflake valide ceci :
La fonction ou la classe spécifiée dans le HANDLER de l’instruction CREATE FUNCTION existe.
Les types d’entrée et de sortie spécifiés dans la déclaration de l’UDF sont compatibles avec les types d’entrée et de sortie du gestionnaire.
Scala¶
Dans la clause HANDLER, le nom de la méthode est sensible à la casse.
Dans les clauses IMPORTS et TARGET_PATH :
Les noms de paquet, de classe et de fichier sont sensibles à la casse.
Le(s) nom(s) de zone de préparation sont insensibles à la casse.
Vous pouvez utiliser la clause PACKAGES pour spécifier les noms et les numéros de version du paquet pour les dépendances Snowflake définies par le système, comme celles de Snowpark. Pour les autres dépendances, spécifiez les fichiers JAR de dépendance avec la clause IMPORTS.
Snowflake valide ceci :
Le fichier JAR spécifié dans le HANDLER de l’instruction CREATE FUNCTION existe et contient la classe et la méthode spécifiées.
Les types d’entrée et de sortie spécifiés dans la déclaration de l’UDF sont compatibles avec les types d’entrée et de sortie de la méthode Scala.
La validation peut se faire au moment de la création ou de l’exécution, selon que vous êtes connecté ou non à un entrepôt Snowflake actif.
Au moment de la création — Si vous êtes connecté à un entrepôt Snowflake actif au moment de l’exécution de l’instruction CREATE FUNCTION, l’UDF est validée au moment de la création.
Au moment de l’exécution — Si vous n’êtes pas connecté à un entrepôt Snowflake actif, l’UDF est créée, mais n’est pas validée immédiatement, et Snowflake renvoie le message suivant :
Function <nom> created successfully, but could not be validated since there is no active warehouse
.
SQL¶
Actuellement, la clause NOT NULL n’est pas appliquée pour des UDFs SQL.
Créer une UDF avec SQL¶
Vous pouvez créer une UDF avec SQL en suivant les étapes suivantes.

Vous créez une UDF en suivant les étapes suivantes :
Écrivez le code du gestionnaire qui s’exécute lorsque l” UDF est appelée.
Vous pouvez utiliser l’un des langages du gestionnaire pris en charge. Pour plus d’informations, voir Langages et outils pris en charge.
Choisissez si vous allez garder le code du gestionnaire en ligne avec l’instruction CREATE FUNCTION SQL ou si vous allez y faire référence dans une zone de préparation.
Chacun a ses avantages. Pour plus d’informations, voir Conserver le code du gestionnaire en ligne ou dans une zone de préparation.
Exécutez une instruction CREATE FUNCTION dans SQL, en spécifiant les propriétés de la fonction.
Le code de l’exemple suivant crée une UDF appelée
function_name
avec un gestionnaire en ligneHandlerClass.handlerMethod
.create function function_name(x integer, y integer) returns integer language java handler='HandlerClass.handlerMethod' target_path='@~/HandlerCode.jar' as $$ class HandlerClass { public static int handlerMethod(int x, int y) { return x + y; } } $$;
Les paragraphes suivants décrivent certaines des propriétés requises ou généralement utilisées lors de la création d’une fonction.
Nom de la fonction.
Le nom de l’UDF ne doit pas nécessairement correspondre au nom de la méthode du gestionnaire. L’instruction CREATE FUNCTION associe le nom de l’UDF au gestionnaire.
Pour plus d’informations sur les contraintes et les conventions relatives aux noms, voir Nommage et surcharge de procédures et d’UDFs.
Les arguments de la fonction, le cas échéant.
Voir Définition des arguments pour UDFs et les procédures stockées.
Type de retour avec la clause RETURNS.
Pour une valeur de retour scalaire, la clause RETURNS spécifiera un seul type de retour ; pour une valeur de retour tabulaire, RETURNS spécifiera le mot clé TABLE précisant le type de colonne dans la valeur de retour tabulaire.
Pour plus d’informations sur la façon dont Snowflake fait correspondre les types de données SQL aux types de données des gestionnaires, voir Nommage et surcharge de procédures et d’UDFs.
Nom du gestionnaire avec la clause HANDLER.
Si nécessaire, il s’agit du nom de la classe ou de la méthode contenant le code qui s’exécute lorsque l’UDF est appelée. Vous devez spécifier un nom de gestionnaire uniquement pour les gestionnaires écrits en Java et en Python. Pour les gestionnaires JavaScript et SQL, tout le code spécifié en ligne sera exécuté comme le gestionnaire.
Le tableau suivant décrit la forme de la valeur de la clause HANDLER en fonction du langage et du type de fonction du gestionnaire.
Langage du gestionnaire
UDF
UDTF
Java
Nom de la classe et de la méthode.
Par exemple :
MyClass.myMethod
Nom de la classe seulement. Le nom de la méthode du gestionnaire est prédéterminé par l’interface requise.
JavaScript
Aucun.
Aucun.
Python
Nom de la classe et de la méthode si une classe est utilisée ; sinon, nom de la fonction.
Par exemple :
module.my_function
oumy_function
Nom de la classe seulement. Le nom de la méthode du gestionnaire est prédéterminé par l’interface requise.
SQL
Aucun.
Aucun.
Dépendances requises par le gestionnaire, le cas échéant, en utilisant les clauses IMPORTS ou PACKAGES.
Pour plus d’informations sur la mise à disposition des dépendances pour votre gestionnaire, voir Mettre les dépendances à la disposition de votre code.
Exécution du langage du gestionnaire avec la clause RUNTIME_VERSION.
Lorsque le langage du gestionnaire est Java ou Python, utilisez la clause RUNTIME_VERSION pour spécifier la version d’exécution prise en charge à utiliser. En omettant la clause, Snowflake utilisera la valeur par défaut, qui peut changer à l’avenir.