Vue d’ensemble des procédures stockées

Vous pouvez écrire des procédures stockées pour étendre le système avec du code procédural. Avec une procédure, vous pouvez utiliser des branchements, des boucles et d’autres constructions programmatiques. Vous pouvez réutiliser une procédure plusieurs fois en l’appelant à partir d’un autre code.

Avec une procédure stockée, vous pouvez :

  • Automatiser les tâches qui nécessitent l’exécution fréquente de plusieurs opérations sur la base de données.

  • Créer et exécuter dynamiquement des opérations de base de données.

  • Exécuter du code avec les privilèges du rôle propriétaire de la procédure plutôt qu’avec les privilèges du rôle qui exécute la procédure.

    Cela permet au propriétaire de la procédure stockée de déléguer le pouvoir d’effectuer des opérations spécifiées à des utilisateurs qui, autrement, ne pourraient pas le faire. Cependant, il existe des limitations à ces procédures stockées avec droits du propriétaire.

Par exemple, imaginons que vous souhaitiez « nettoyer » une base de données en supprimant des données antérieures à une date spécifiée. Vous pouvez exécuter l’opération de suppression plusieurs fois dans votre code, en supprimant à chaque fois les données d’une table spécifique. Vous pouvez placer toutes ces instructions dans une seule procédure stockée, puis passer un paramètre qui spécifie la date limite.

Une fois la procédure déployée, vous pouvez l’appeler pour nettoyer la base de données. Au fur et à mesure que votre base de données évolue, vous pouvez mettre à jour la procédure pour nettoyer des tables supplémentaires ; si plusieurs utilisateurs utilisent la nouvelle commande de nettoyage, ils peuvent appeler une seule procédure, plutôt que de se souvenir de chaque nom de table et de nettoyer chaque table individuellement.

Une procédure stockée est comme une UDF, mais les deux diffèrent sur des points importants. Pour plus d’informations, voir Choisir d’écrire une procédure stockée ou une fonction définie par l’utilisateur.

Une procédure n’est qu’un moyen parmi d’autres d’étendre Snowflake. Pour les autres, voir ce qui suit :

Langages et outils pris en charge

Vous pouvez créer et gérer des procédures stockées (et d’autres entités Snowflake) à l’aide de plusieurs outils, en fonction de votre méthode de travail.

Langage

Approche

Assistance

SQL

Avec un gestionnaire en Java, JavaScript, Python, Scala, ou SQL Scripting

Écrivez le code SQL dans Snowflake pour créer et gérer des entités Snowflake. Rédigez la logique de la procédure dans l’un des langages de gestionnaire pris en charge.

Java

JavaScript

Python

Scala

SQL Scripting

Java, Python, ou Scala

API Snowpark

Sur le client, écrivez le code des opérations qui sont transmises à Snowflake pour traitement.

Java

Python

Scala

Interface de ligne de commande

Snowflake CLI

Utilisez la ligne de commande pour créer et gérer des entités Snowflake, en spécifiant des propriétés en tant que propriétés d’objets JSON.

Gestion des objets Snowflake

Python

API Snowflake Python

Sur le client, écrivez du code qui exécute des opérations de gestion sur Snowflake.

Gestion de procédures stockées

REST

API REST Snowflake

Effectuez des requêtes auprès des points de terminaison RESTful pour créer et gérer des entités Snowflake.

Gérer les procédures

Vous écrivez la logique d’une procédure (son gestionnaire) dans l’un des langages pris en charge. Une fois que vous avez un gestionnaire, vous pouvez créer une procédure avec une commande CREATE PROCEDURE, puis appeler la procédure avec une instruction CALL.

À partir d’une procédure stockée, vous pouvez renvoyer une valeur unique ou (si le langage du gestionnaire le permet) des données tabulaires. Pour plus d’informations sur les types de retour pris en charge, voir CREATE PROCEDURE.

Lorsque vous choisissez un langage, tenez également compte des emplacements du gestionnaire pris en charge. Tous les langages ne permettent pas de faire référence au gestionnaire sur une zone de préparation (le code du gestionnaire doit être en ligne). Pour plus d’informations, consultez Conserver le code du gestionnaire en ligne ou dans une zone de préparation.

Langage

Emplacement du gestionnaire

Java

En ligne ou en zone de préparation

JavaScript

En ligne

Python

En ligne ou en zone de préparation

Scala

En ligne ou en zone de préparation

Exécution de scripts Snowflake

En ligne

Note

Pour créer et appeler une procédure anonyme, utilisez CALL (avec procédure anonyme). La création et l’appel d’une procédure anonyme ne nécessitent pas un rôle avec des privilèges de schéma CREATE PROCEDURE.

Exemple de procédure stockée

Le code de l’exemple suivant crée une procédure stockée appelée myproc avec un gestionnaire Python appelé run.

CREATE OR REPLACE PROCEDURE myproc(from_table STRING, to_table STRING, count INT)
  RETURNS STRING
  LANGUAGE PYTHON
  RUNTIME_VERSION = '3.9'
  PACKAGES = ('snowflake-snowpark-python')
  HANDLER = 'run'
as
$$
def run(session, from_table, to_table, count):
  session.table(from_table).limit(count).write.save_as_table(to_table)
  return "SUCCESS"
$$;
Copy

Le code de l’exemple suivant appelle la procédure stockée myproc.

CALL myproc('table_a', 'table_b', 5);
Copy

Lignes directrices et contraintes

Conseils:

Pour des conseils sur l’écriture de procédures stockées, voir Travailler avec des procédures stockées.

Contraintes liées à Snowflake:

Vous pouvez assurer la stabilité de l’environnement Snowflake en vous développant dans le cadre des contraintes de Snowflake. Pour plus d’informations, consultez Concevoir des gestionnaires qui respectent les contraintes imposées par Snowflake.

Nommage:

Veillez à nommer les procédures de manière à éviter les collisions avec d’autres procédures. Pour plus d’informations, consultez Nommage et surcharge de procédures et d’UDFs.

Arguments:

Spécifiez les arguments de votre procédure stockée et indiquez quels arguments sont facultatifs. Pour plus d’informations, consultez Définition des arguments pour UDFs et les procédures stockées.

Mappages de types de données:

Pour chaque langage de traitement, il existe un ensemble distinct de mappages entre les types de données du langage et les types SQL utilisés pour les arguments et les valeurs de retour. Pour plus d’informations sur les mappages pour chaque langage, voir Mappage des types de données entre SQL et les langages de traitement.

Écriture du gestionnaire

Langues du gestionnaire:

Pour du contenu spécifique à une langue sur l’écriture d’un gestionnaire, consultez Langages et outils pris en charge.

Accès au réseau externe:

Vous pouvez accéder aux emplacements réseau externes avec un accès au réseau externe. Vous pouvez créer un accès sécurisé à des emplacements réseau spécifiques externes à Snowflake, puis utiliser cet accès à partir du code du gestionnaire.

Journalisation et traçage:

Vous pouvez enregistrer l’activité du code en capturant les messages du journal et les événements de trace, en stockant les données dans une base de données que vous pouvez interroger ultérieurement.

Sécurité

Le fait qu’une procédure stockée soit exécutée avec les droits de l’appelant ou du propriétaire peut avoir une incidence sur les informations auxquelles elle a accès et sur les tâches qu’elle peut être autorisée à effectuer. Pour plus d’informations, consultez Présentation des procédures stockées des droits de l’appelant et des droits du propriétaire.

Les procédures stockées partagent certains problèmes de sécurité avec les fonctions définies par l’utilisateur (UDFs). Pour plus d’informations, voir ci-dessous :

Déploiement du code du gestionnaire

Lors de la création d’une procédure, vous pouvez spécifier son gestionnaire (qui met en œuvre la logique de la procédure) en tant que code en ligne avec l’instruction CREATE PROCEDURE ou en tant que code externe à l’instruction, tel que le code compilé et copié dans une zone de préparation.

Pour plus d’informations, voir Conserver le code du gestionnaire en ligne ou dans une zone de préparation.