Définition des arguments pour UDFs et les procédures stockées

Dans CREATE FUNCTION ou CREATE PROCEDURE que vous exécutez pour définir une fonction ou une procédure, vous spécifiez les arguments qui peuvent être transmis. Par exemple :

CREATE FUNCTION my_function(integer_argument INT, varchar_argument VARCHAR)
  ...
Copy
CREATE PROCEDURE my_procedure(boolean_argument BOOLEAN, date_argument DATE)
  ...
Copy

Lorsque vous appelez une fonction ou une procédure, les valeurs des arguments sont liées aux arguments du gestionnaire. Elles peuvent être liées en fonction des noms correspondants ou de la position de l’argument, selon le langage que vous utilisez pour le gestionnaire.

Cette rubrique fournit des indications sur la spécification des arguments d’une fonction ou d’une procédure.

Limitation du nombre d’arguments d’entrée

Les fonctions scalaires (UDFs) ont une limite de 500 arguments d’entrée.

Spécifiez les types de données pour les arguments

Choisissez le type de données SQL qui correspond au type de données de l’argument que vous utilisez dans le code du gestionnaire.

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.

Omettez l’argument Session pour les procédures Java, Python et Scala

Dans l’instruction CREATE PROCEDURE d’une procédure écrite en Java, Python ou Scala, ne définissez pas l’argument de l’objet Snowpark Session.

Par exemple, supposons que le code de votre gestionnaire transmette un objet Session et un objet String:

public String queryTable(Session session, String tableName) { ... }
Copy

Dans l’instruction CREATE PROCEDURE, ne définissez pas d’argument pour l’objet Session. Au lieu de cela, définissez simplement un argument pour la chaîne d’entrée :

CREATE OR REPLACE PROCEDURE query_table(table_name VARCHAR)
  ...
Copy

Session est un argument implicite que vous ne spécifiez pas lors de l’appel de la procédure. Lorsque vous appelez votre procédure stockée, Snowflake crée un objet Session et le transmet à votre procédure stockée.

Spécifiez des arguments facultatifs

Vous pouvez spécifier qu’un argument est facultatif. Voir les sections suivantes pour plus de détails :

Désignation d’un argument comme facultatif

Si vous souhaitez qu’un argument soit facultatif, utilisez le mot-clé DEFAULT pour spécifier la valeur par défaut de l’argument. Par exemple :

CREATE OR REPLACE FUNCTION build_string_udf(
    word VARCHAR,
    prefix VARCHAR DEFAULT 'pre-',
    suffix VARCHAR DEFAULT '-post'
  )
  ...
Copy
CREATE OR REPLACE PROCEDURE build_string_proc(
    word VARCHAR,
    prefix VARCHAR DEFAULT 'pre-',
    suffix VARCHAR DEFAULT '-post'
  )
  ...
Copy

Pour la valeur par défaut de l’argument, vous pouvez utiliser une expression. Par exemple :

CREATE OR REPLACE FUNCTION my_date_udf(optional_date_arg DATE DEFAULT CURRENT_DATE())
  ...
Copy

Vous devez spécifier les arguments facultatifs après les arguments obligatoires (le cas échéant). Vous ne pouvez pas spécifier un argument facultatif avant un argument obligatoire.

-- This is not allowed.
CREATE FUNCTION wrong_order(optional_argument INTEGER DEFAULT 0, required_argument INTEGER)
  ...
Copy

Surcharge des fonctions et des procédures avec des arguments facultatifs

Si vous surchargez une fonction ou une procédure, vous ne pouvez pas utiliser d’argument facultatif pour distinguer les différentes signatures. Par exemple, supposons que vous créiez l’UDF suivant qui ne transmet aucun argument :

CREATE FUNCTION my_udf_a()
  ...
Copy

Si vous tentez de créer un UDF portant le même nom et contenant un argument facultatif, l’instruction CREATE FUNCTION échoue :

CREATE FUNCTION my_udf_a(optional_arg INTEGER DEFAULT 0)
  ...
Copy
000949 (42723): SQL compilation error:
  Cannot overload FUNCTION 'MY_UDF_A' as it would cause ambiguous FUNCTION overloading.

Autre exemple : supposons que vous créiez un UDF qui transmet un argument INTEGER obligatoire :

CREATE FUNCTION my_udf_b(required_arg INTEGER)
  ...
Copy

Si vous tentez de créer un UDF portant le même nom et contenant un argument obligatoire INTEGER et un argument facultatif, l’instruction CREATE FUNCTION échoue :

CREATE FUNCTION my_udf_b(required_arg INTEGER, optional_arg INTEGER DEFAULT 0)
  ...
Copy
000949 (42723): SQL compilation error:
  Cannot overload FUNCTION 'MY_UDF_B' as it would cause ambiguous FUNCTION overloading.

Cela concerne également les cas où vous utilisez ALTER FUNCTION… RENAME ou ALTER PROCEDURE… RENAME pour renommer une fonction ou une procédure. Si vous souhaitez renommer une fonction ou une procédure, il ne peut y avoir de fonction existante portant le même nom et la même signature. Les arguments facultatifs ne distinguent pas une signature d’une autre.

Par exemple, supposons que vous créiez un UDF nommé abc_udf qui transmet un argument requis INTEGER:

CREATE FUNCTION abc_udf(required_arg INTEGER)
  ...
Copy

Supposons que vous créiez un UDF avec un nom différent (def_udf) qui transmet un argument obligatoire INTEGER et un argument facultatif :

CREATE FUNCTION def_udf(required_arg INTEGER, optional_arg INTEGER DEFAULT 0)
  ...
Copy

Si vous tentez de changer le nom de def_udf en abc_udf, une erreur se produit car il existe déjà un UDF portant le même nom et ayant les mêmes types d’arguments requis :

000949 (42723): SQL compilation error:
  Cannot overload FUNCTION 'ABC_UDF' as it would cause ambiguous FUNCTION overloading.

Appel de fonctions et de procédures ayant des arguments facultatifs

Pour appeler des fonctions et des procédures qui ont des arguments facultatifs, voir :