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 clauses
OR REPLACE
etIF NOT EXISTS
sâexcluent mutuellement. Elles ne peuvent pas ĂȘtre utilisĂ©es dans la mĂȘme instruction.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.